2017-05-06 2 views
0

Got ein kleines Problem mit der Konvertierung von xslt ... ist ein kleines Problem, ich denke, aber ich kann keine Lösung im Internet finden. Wenn ich versuche, eine Zahl oder ein Datum innerhalb eines XML-Knotens auszuwählen, kann ich in der anderen XML nicht anzeigen. i Xslt Version verwende = 1,0XSLT-Nummer in XML zu XML

Dies ist die Original-Code ist:

<?xml version="1.0" encoding="utf-8"?> 
<ALL_Machines_having_buttons_from_a_Machintype_price_greater9700> 
    <GreaterTypes> 
     <typename>Grant and Sons</typename> 
     <price>984912.41</price> 
     <serialnumber>7</serialnumber> 
     <outputrate>5</outputrate> 
     <purchasebillxml> 
     <purchasebill> 
      <billnumber>345-20-2422</billnumber> 
      <seller> 
       <id>Nienow-Daugherty</id> 
      </seller> 
      <product> 
       <articlenumber>172185964-0</articlenumber> 
       <amount>50359</amount> 
       <price>676833.08</price> 
      </product> 
      <date>2004-01-28</date> 
     </purchasebill> 
     </purchasebillxml> 
     <buttonsname>595027529-2</buttonsname> 
     <colour>Khaki</colour> 
    </GreaterTypes> 
</ALL_Machines_having_buttons_from_a_Machintype_price_greater9700> 

die XSL:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/> 

<xsl:template match="/ALL_Machines_having_buttons_from_a_Machintype_price_greater9700"> 
<humans> 
<xsl:for-each select="GreaterTypes"> 
<human> 
    <firstName><xsl:value-of select="typename"/></firstName> 
    <livingyears><xsl:value-of select="amount"/></livingyears> 
    <alifesince><xsl:value-of select="date"/></alifesince> 
</human> 

</xsl:for-each> 

</humans> 
</xsl:template> 

</xsl:stylesheet> 

, was ich bekommen:

<humans> 
<human> 
    <firstName>Grant and Sons</firstName> 
    <livingyears/> 
    <alifesince/> 
</human> 
</humans> 
+0

Ihr XSLT-Code funktioniert nicht. Sie müssen die erste entfernen. Dann funktioniert es wie erwartet. – Gerriet

+0

Sie haben Recht Ich sah das Problem ... Dies ist ein Beispiel, das ich gemacht habe, um mein Problem zu demonstrieren ... irgendwie in meiner ursprünglichen Datei funktioniert es nicht :(Ich weiß nicht warum –

+1

Es ist gut, das Beispiel so weit zu vereinfachen möglich, aber das bedeutet natürlich, dass es immer noch das Problem repliziert, an dem Sie interessiert sind. So haben Sie nun eine Vereinfachung, die funktioniert und Sie können Teile Ihres Originals hinzufügen, bis das Problem wieder auftritt. – Gerriet

Antwort

1

Das Problem ist, dass date und amount sind keine direkten Kinder von GreaterTypes aber tiefere Nachkommen, so dass Sie den vollständigen relativen Pfad zu ihnen angeben müssen.

Zum Beispiel für date wäre es dies:

<xsl:value-of select="purchasebillxml/purchasebill/date"/> 

dieses XSLT Versuchen

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/ALL_Machines_having_buttons_from_a_Machintype_price_greater9700"> 
<humans> 
<xsl:for-each select="GreaterTypes"> 
<human> 
    <firstName><xsl:value-of select="typename"/></firstName> 
    <livingyears><xsl:value-of select="purchasebillxml/purchasebill/product/amount"/></livingyears> 
    <alifesince><xsl:value-of select="purchasebillxml/purchasebill/date"/></alifesince> 
</human> 
</xsl:for-each> 
</humans> 
</xsl:template> 

</xsl:stylesheet> 
+0

vielen Dank, dass der Trick! :) –

0

Zusätzlich zu der Entfernung zusätzliches human-tag, würde ich auch die for-each-loop durch ein template-match ersetzen. Wie folgt:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/> 

<xsl:template match="/persons"> 
<humans> 
<xsl:apply-templates/> 
</humans> 
</xsl:template> 

<xsl:template match="person"> 
<human> 
    <firstName><xsl:value-of select="name"/></firstName> 
    <livingyears><xsl:value-of select="age"/></livingyears> 
    <alifesince><xsl:value-of select="birthday"/></alifesince> 
</human> 
</xsl:template> 

</xsl:stylesheet> 
0

Ihr XSLT sieht im Allgemeinen OK.

Entfernen Sie die erste <humans>. Es befindet sich außerhalb einer beliebigen Vorlage und hat kein übereinstimmendes schließendes Tag.

Für den Zweck, um Ihren Code zu testen, entfernte ich auch xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl" (nicht benötigt).

Ich habe Ihren Code mit den obigen Korrekturen getestet und das Ergebnis ist OK. Überprüfen Sie unter http://xsltransform.net/a9Giww

Vielleicht ist das eigentliche Problem irgendwo außerhalb des Stücks Code, die Sie in diesem Beitrag enthalten versteckt. Schauen Sie gründlich Ihren ganzen Code.