Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XPath / 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 Konvertierung von Elementen in Attribute.

Alle child::*

Für folgenden XML-Input:


<A>
	<B1/>
	<B2/>
	<B3/>
	<B4/>
	<B5/>
	<B6/>
	<B7/>
	<B8/>
	<B9/>
</A>

... und folgendem Code:


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
    <ergebnis>
      <xsl:for-each select="A/child::*">
        <Element>
          <xsl:value-of select="name()"/>
        </Element>
      </xsl:for-each>
    </ergebnis>
    </xsl:template>
</xsl:stylesheet>

... lautet das Ergebnis:


<ergebnis>
   <Element>B1</Element>
   <Element>B2</Element>
   <Element>B3</Element>
   <Element>B4</Element>
   <Element>B5</Element>
   <Element>B6</Element>
   <Element>B7</Element>
   <Element>B8</Element>
   <Element>B9</Element>
</ergebnis>

Bei folgendem abweichenden Code:


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
    <ergebnis>
      <xsl:for-each select="A/child::*[1]">
        <Element>
          <xsl:value-of select="name()"/>
        </Element>
      </xsl:for-each>
    </ergebnis>
    </xsl:template>
</xsl:stylesheet>

... lautet das Ergebnis dagegen:


<?xml version="1.0" encoding="UTF-8"?>
<ergebnis>
   <Element>B1</Element>
</ergebnis>

wg / 14. März 2021



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.




XPath

XPath-Achsen

self::*



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