2016-06-29 4 views
0

Ich versuche, XSLT 2.0 zu verwenden, aber das Tag <xsl:value-of select=...> gibt mir das erste Element nicht mehr. Ich bekomme alle Werte im XML. Wie kann ich das folgende XSLT für die Arbeit mit XSLT 2.0 konvertieren?Konvertierung von XSLT 1.0 zu 2.0 gibt keinen ersten Text von einem Tag

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="Data/ABC"> 
     <xsl:for-each select="."> 
      <Data xmlns="example.com"> 
       <GEF> 
        <id><xsl:value-of select="id"/></id> 
        <time><xsl:value-of select="time"/></time> 
        <type>test</type> 
       </GEF> 
      </Data> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Wenn ich diese XML hatte:

<Data xmlns="example.com"> 
    <ABC> 
     <id>2</id> 
     <time>125622</time> 
    </ABC> 
</Data> 

Wenn ich mit Hilfe von XSLT wurde 1,0, würde ich dieses:

<Data xmlns="example.com"> 
    <GEF> 
     <id>2</id> 
     <time>125622</time> 
     <type>test</type> 
    </GEF> 
</Data> 

Normalerweise würde ich 2 und 125622 als Einzelstücke bekommen für jedes Tag in der XSLT. Nun erhält es jedoch nur die beiden Werte und gibt sie aus. Es druckt nicht einmal die Tags nach der Transformation. Was soll ich in 2.0 verwenden? Meine Suche hat nichts gebracht.

Dies ist, was ich mit 2,0 erhalten:

<Data xmlns="example.com"> 

    2 
    125622 
    test 

</Data> 
+0

Was ist das gewünschte Ergebnis zu bekommen? - Und warum hast du '' aber keine Vorlagen in diesem Modus? –

+0

"Nun werden nur die beiden Werte abgerufen und ausgegeben. Die Tags werden nach der Umwandlung nicht einmal gedruckt." Es klingt so, als ob die Elemente in Ihrer XML-Eingabe in einem Namespace liegen und Ihre Vorlagen nicht angewendet werden. Gibt es irgendwelche 'xmlns =" ​​... "' auf dem 'Data' Element oder einem Vorfahren? –

+2

Ihre zweite Vorlagenübereinstimmung sollte 'match =" ABC "' lauten. Da Sie die Übereinstimmung überqualifizieren, werden nur die Standardumwandlungsregeln angewendet, nämlich nur den Text der Elemente. Entferne 'Data /' und es sollte funktionieren. –

Antwort

1

XSLT und XPath (1,0 als spätere Versionen) bewusst Datenmodell mit einem Namespace arbeiten, da so <Data xmlns="example.com"> das Data Element und seine Nachkommen im Namensraum sind example.com und Ihr XSLT muss dies berücksichtigen. In XSLT 2.0 können Sie mit

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="example.com"> 

Wie für Ihre Java-Code tun, stellen Sie sicher, verwenden Sie einen namespace aware DocumentBuilderFactory.

+0

Danke. Ich bekomme den Output, den ich möchte. Es druckt nun wie es soll. Unter dem letzten "" druckt es jedoch auch alle Textwerte aus. Außerdem, ' funktioniert nicht mehr (funktionierte gut mit 1.0). Irgendeine Idee, warum das sein könnte? Nochmals danke Vielen Dank für die Hilfe! – syy

+0

Wie für die Textwerte ausgedruckt, würde ich erwarten, dass dies für die erste Version des Codes passieren, die einen Modus verwendet, aber keine explizite Vorlage in diesem Modus hatte. Für das param-Problem Ich denke, du solltest eine neue Frage stellen, '' sieht sicherlich falsch aus und müsste ''. Aber relative URIs können ein Problem sein, stellen Sie bitte eine neue Frage mit allen notwendigen Details von XSLT und Java Code. –

+0

Ich habe Vorlagen für die Modi definiert, in denen ich aufgelistet habe mein XSLT.So gibt es keinen Modus, der nicht verwendet wird.Es ist wegen dieser Zeile: '\t \t '? Dachte, das wurde für Vorlagen verwendet th bei haben keine Modi. Und ich werde eine neue Frage für das andere Problem stellen. – syy

2

Eine Möglichkeit, Ihren Code unter XSLT 2.0 zu verwenden, besteht darin, ihn im Abwärtskompatibilitätsmodus auszuführen, was Sie einfach tun können, indem Sie die Versionsnummer als version = "1.0" belassen. Wenn Sie wissen, dass die Abhängigkeit von XSLT 1.0 Semantik nur auf bestimmte Teile des Stylesheet gilt, dann können Sie diese selektiv tun, zum Beispiel

  <xsl:for-each select="." version="1.0"> 
      <Data xmlns="example.com"> 
       <GEF> 
        <id><xsl:value-of select="id"/></id> 
        <time><xsl:value-of select="time"/></time> 
        <type>test</type> 
       </GEF> 
      </Data> 
     </xsl:for-each> 

Wenn Sie können, aber es ist am besten, um den Code zu konvertieren, die 2.0 zu arbeiten Weg. Wenn Sie nur eine xsl:value-of Anweisung wollen das erste Element in einem Knoten-Satz zu verarbeiten, nur [1] fügen Sie den ersten Punkt zu wählen, zum Beispiel

<id><xsl:value-of select="id[1]"/></id> 
+0

Danke! Gut zu wissen, dass ich es auch so schaffen kann. – syy