2016-07-19 12 views
3

Ich habe dieses einfache XML-DokumentXPath innerhalb Xslt ergibt anderes Ergebnis aus dem direkten Auswertung von XPath

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns="http://example.org/attributes"> 
    <record> 
     <codice_fiscale>IT07654930130</codice_fiscale> 
     <indirizzo tipo="casa">Viale Carlo Espinasse 5, Como</indirizzo> 
    </record> 
    <n:record xmlns:n="http://test.com/records"> 
     <n:codice_fiscale>IT87654770157</n:codice_fiscale> 
     <n:indirizzo tipo="ufficio">Via Biancospini 20, Messina</n:indirizzo> 
    </n:record> 
    <record> 
     <codice_fiscale>IT471142131</codice_fiscale> 
     <indirizzo tipo="ufficio">Via Chiasserini 88B, Firenze</indirizzo> 
     <test> 
      <nummeroo>01-000-000</nummeroo> 
      <nummeroo>02-000-000</nummeroo> 
     </test> 
     <test> 
      <nummeroo>03-000-000</nummeroo> 
      <nummeroo>04-000-000</nummeroo> 
     </test> 
     <stuff>other stuff</stuff> 
    </record> 
    <things> 
     <nummero>08-000-000</nummero> 
     <nummero>09-000-000</nummero> 
    </things> 
</root> 

Der folgende XSLT 2.0 Sheet ausgeben soll die Namen aller Elemente, die mindestens eine Blattknoten als habe Kind.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="no" /> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="//*[child::*[not(*)]]"> 
     <xsl:value-of select="concat(name(), '&#xa;')" /> 
    </xsl:template> 
</xsl:stylesheet> 

Ich benutze die omit-xml-declaration und ich alle Leerzeichen Streifen ein einfaches Textdokument zu erhalten. Verkettung mit '&#xa;' gibt mir eine Zeilenumbruch.

der oben genannten XML-Dokument angewandt, um die XSLT

record 
n:record 
record 
things 

Verwenden der XPath 2.0 Expression der Vorlage innerhalb des Sheet das folgende Ergebnis liefert, dh

//*[child::*[not(*)]] 

in Verbindung mit dem Namen () - Funktion zum Abrufen des Elementnamens als Zeichenfolge, dh

//*[child::*[not(*)]]/name() 

I erhalten das folgende Ergebnis

record 
n:record 
record 
test 
test 
things 

Mit dem XSLT 2.0 Stylesheet (verschiedene Editoren/XPath 2.0 Gutachter verwenden) und direkt den XPath 2.0-Ausdruck mit einem Editor Ausbeute unterschiedliche Bewertung der Ergebnisse!

Ich würde erwarten, dass die Ergebnisse genau gleich sein werden. Das Stylesheet und die direkte Auswertung des xpath //*[child::*[not(*)]]/name() sind im Wesentlichen gleich und sollten die gleiche Textausgabe liefern.

Der XPath-Ausdruck und das Stylesheet sind sehr einfach und trotzdem kann ich nicht herausfinden, warum die Auswertung der beiden zu unterschiedlichen Ergebnissen führt.

Hat jemand eine Idee, warum die beiden Bewertungen zu unterschiedlichen Ergebnissen führen?

Antwort

3

Eine Übereinstimmung Muster ist nicht das gleiche wie ein select Ausdruck.

Was mit Ihrem Stylesheet geschieht, ist dies:

  • Zunächst werden die integrierten Template-Regeln an den Knoten / Wurzel angewendet werden.

  • Anschließend werden mit der integrierten Rekursion die gleichen integrierten Vorlagen auf das Stammelement root angewendet.

  • Als Nächstes fügt Ihre Vorlage die Knoten ein, die untergeordnete Elemente des Stammelements sind - und hier endet die Verarbeitung, da Ihre Vorlage keine xsl:apply-templates-Anweisung enthält.

Beachten Sie, dass ein führender // in einem Matchmuster ignoriert wird.

+0

Danke für die hilfreiche Erklärung Michael. Es scheint, dass ich noch viel über xslt lernen muss. – Newbee