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

child::*

child::*

➪ Mit child::* erhalten Sie 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 Sie 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 Childnodes 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 Sie 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 bedingt 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 / 15. September 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


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

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XPath_Achsen6.html