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

following::*

following::*

➪ Mit following::* erhalten Sie Folge-Nodes des aktuellen Knotens.

Arbeiten Sie stattdessen mit following::*, so erhalten Sie 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-Input-Dokument 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 Sie 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, dass 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 Elementen, die bestimmte Eigenschaften haben. Zum Beispiel geht es darum, in der Liste der folgenden Nodes den vorname jenes Mensch-Elements 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 Sie zudem wissen, an welcher Stelle sich dieses Element befindet, so verwenden Sie 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 Sie, dass sich das gesuchte Element an der 7. Stelle nach dem ursprünglich adressierten Node befindet.


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

Weist das XML-Dokument Namespaces auf, so genügt es, den Namespace-Präfix in following einzuarbeiten: following::ns3:Mensch.


<xsl:stylesheet 
    xmlns:d="www.wilfried-grupe.de/Beispiele/2018" 
    xmlns:ns1="www.wilfried-grupe.de/Orte/2018"
    xmlns:ns2="www.wilfried-grupe.de/Ort" 
    xmlns:ns3="www.wilfried-grupe.de/Mensch"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
     <ergebnis>
        <xsl:for-each 
             select="/ns1:Orte/ns2:Ort[1]
                              /ns3:Mensch[2]
                              /following::ns3:Mensch">
            <M>
                <xsl:value-of select="d:vorname"/>
            </M>
        </xsl:for-each>
     </ergebnis>
    </xsl:template>
</xsl:stylesheet>

Siehe auch

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