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

following::*

following::*

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

Arbeiten wir stattdessen mit following::*, so erhalten wir nicht nur die folgenden Mensch-Nodes samt derer Childnodes, sondern auch der folgenden Nodes.

pic/XPath_following.jpg


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

Je nach dem XML Inputdokument und dem jeweils adressierten Start-Node kann die Ergebnisliste sehr umfangreich werden, weil nicht nur die folgenden Nodes abgearbeitet werden, sondern auch deren Parent-und Childnodes, unabhängig von ihrem Namen.

Möchten wir in der Ergebnisliste nur Elemente mit einem bestimmten Node-Namen haben, so lautet der Aufruf:


<xsl:for-each 
     select="/Orte/Ort[1]/Mensch[2]
     /following::Mensch">
...
</xsl:for-each>

Das Ergebnis sieht ähnlich dem following-sibling::* aus, unterscheidet sich aber darin, daß following-sibling::* nur jene Nodes in Betracht zieht, die denselben Parent-Node haben wie das adressierte Start-Element. following::Mensch bezieht auch jene "Mensch"-Nodes mit ein, die einen anderen Parent-Node haben.

pic/XPath_following_Mensch.png

Eine häufige Aufgabenstellung ist die Suche nach Elemente, die bestimmte Eigenschaften haben. Zum Beispiel geht es darum, in der Liste der folgenden Nodes den "vorname" jenes Mensch-Elementes zu erhalten, dessen Childnode "name" einen gesuchten Inhalt hat. Hier kommen Prädikate ins Spiel.


 <xsl:template match="/">
  <ergebnis>
   <xsl:for-each 
        select="/Orte/Ort[1]/Mensch[2]
                /following::Mensch[name='Sinnlos']">
    <M>
     <xsl:value-of select="vorname"/>
    </M>
   </xsl:for-each>
  </ergebnis>
 </xsl:template>

Das gefundene Ergebnis lautet hier:


<ergebnis>
   <M>Simone</M>
</ergebnis>

Möchten wir zudem wissen, an welcher Stelle sich dieses Element befindet, so verwenden wir einen anderen Ansatz:


 <xsl:template match="/">
  <ergebnis>
   <xsl:for-each 
        select="/Orte/Ort[1]/Mensch[2]
                /following::Mensch">
    <xsl:if test="name='Sinnlos'">
     <M Position="{position()}">
      <xsl:value-of select="vorname"/>
     </M>
    </xsl:if>
   </xsl:for-each>
  </ergebnis>
 </xsl:template>

Hier sehen wir, daß sich das gesuchte Element an der 7. Stelle nach dem ursprünglich adressierten Node befindet.


<ergebnis>
   <M Position="7">Simone</M>
</ergebnis>

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_Achsen3.html