XPath 3.0, XPath 2.0, XPath 1.0 / XPath-Achsen / child::*

child::*

child::*

XPath-Pfade und Achsen definieren den Verlauf, Umfang und Richtung, in dem die umgebenden Nodes abgearbeitet werden.

Mit child::* erhalten wir die Childnodes des aktuellen Nodes.

pic/XPath_child.jpg


 <xsl:template match="/">
  <ergebnis>
   <xsl:for-each 
        select="Orte/Ort[1]/child::*">
    <e nr="{position()}">     
       <xsl:call-template 
            name="generateXPath"/>
    </e>
   </xsl:for-each>
  </ergebnis>
 </xsl:template>

Damit erhalten wir ein Ergebnis, das je nach XML Input Dokument beispielsweise so aussehen könnte:


<ergebnis>
   <e nr="1">/Orte/Ort[1]/id[1]</e>
   <e nr="2">/Orte/Ort[1]/name[1]</e>
   <e nr="3">/Orte/Ort[1]/Mensch[1]</e>
   <e nr="4">/Orte/Ort[1]/Mensch[2]</e>
   <e nr="5">/Orte/Ort[1]/Mensch[3]</e>
   <e nr="6">/Orte/Ort[1]/Mensch[4]</e>
   <e nr="7">/Orte/Ort[1]/Mensch[5]</e>
   <e nr="8">/Orte/Ort[1]/Mensch[6]</e>
</ergebnis>

Eine häufige praktische Aufgabe besteht jedoch darin, nur bestimmte Nodes anzusprechen, beispielsweise nur die Mensch-Elemente. Dann lautet der Aufruf:


 <xsl:template match="/">
  <ergebnis>
   <xsl:for-each 
    select="Orte/Ort[1]/child::Mensch">
    <e nr="{position()}">  
     <xsl:call-template 
      name="generateXPath"/>
    </e>
   </xsl:for-each>
  </ergebnis>
 </xsl:template>

... und wir erhalten dieses Ergebnis:


<ergebnis>
   <e nr="1">/Orte/Ort[1]/Mensch[1]</e>
   <e nr="2">/Orte/Ort[1]/Mensch[2]</e>
   <e nr="3">/Orte/Ort[1]/Mensch[3]</e>
   <e nr="4">/Orte/Ort[1]/Mensch[4]</e>
   <e nr="5">/Orte/Ort[1]/Mensch[5]</e>
   <e nr="6">/Orte/Ort[1]/Mensch[6]</e>
</ergebnis>

Umgekehrt ist es ein häufiges praktisches Problem, bestimmte Nodes (z.B. "Mensch") zu ignorieren und nur alle andere anzusprechen. Dann lautet der Aufruf:


 <xsl:template match="/">
  <ergebnis>
   <xsl:for-each 
    select="Orte/Ort[1]/child::*[name() != 'Mensch']">
    <e nr="{position()}">  
     <xsl:call-template 
      name="generateXPath"/>
    </e>
   </xsl:for-each>
  </ergebnis>
 </xsl:template>

... und das Ergebnis:


<ergebnis>
   <e nr="1">/Orte/Ort[1]/id[1]</e>
   <e nr="2">/Orte/Ort[1]/name[1]</e>
</ergebnis>

Syntaktisch korrekt, aber nur empfehlenswert ist die Arbeit mit local-name().


   <xsl:for-each 
        select="Orte/Ort[1]/child::*
                [local-name()='Mensch']">
...
   </xsl:for-each>

Dabei werden sämtliche Nodes angesprochen, die den jeweiligen Namen haben bzw. nicht haben, unabhängig von deren Namespace, also etwa auch:


suchmichnicht:Mensch
andererNamespace:Mensch

Siehe auch von Elementen in Attribute.

wg / 7. Januar 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

Mobil: 0151. 750 360 61 * eMail: info2018@wilfried-grupe.de

www.wilfried-grupe.de/XPath_Achsen6.html