XPath 3.0, XPath 2.0, XPath 1.0 / XPath-Achsen / XPath: Pfade, Prädikate

XPath: Pfade, Prädikate

XPath: Pfade, Prädikate

➪ Statt der möglicherweise aufwendigen Arbeit mit child::*, descendant::* etc. gibt es noch die Möglichkeit, Elemente und Attribute mit einer "Kurzschreibweise" sowie über sogenannte Prädikate präzise zu adressieren, um sie in eine Sequenz einzufügen, die ausgewertet werden kann.

/ liefert allein den Wurzelknoten.
// //Mensch liefert Mensch-Nodes auf diversen Ebenen.
/Orte liefert alle Kind-Elemente mit dem Namen des Wurzel-Elements Orte. Alternative: /child::Orte
/Orte/Ort/Mensch liefert alle Vorkommen von Mensch unterhalb von Ort, dessen Rootnode Orte ist. Alternative: /child::Orte/child::Ort/child::Mensch
../Mensch wählt die Elemente Mensch aus, die Childnodes vom Parent-Node des Kontextknotens Mensch sind. Das heißt, wenn ein Ort mehrere Childnodes Mensch hat, werden sie alle angesprochen. Beispiel: //Ort[2]/Mensch[2]/../Mensch: Der erste Teil //Ort[2]/Mensch[2] adressiert einen speziellen Mensch-Node im Baum. ../Mensch geht von diesem Node eine Ebene nach oben (Ort) und sucht von dort alle Childnodes Mensch. Alternative: //Ort[2]/Mensch[2]/parent::*/child::Mensch
./Mensch wählt Kind-Elemente Mensch des Kontextknotens aus. Ist der Kontextknoten beispielsweise /Orte/Ort[2], so erreichen Sie über ./Mensch dessen Childnodes Mensch. Alternative: ./child::Mensch
* wählt alle Kind-Elemente des Kontextknotens aus. Beispiel: /Orte/*. Alternative: /Orte/child::*
*/Mensch wählt alle Elemente mit dem Namen Mensch aus, die Enkel-Elemente (Kindeskinder) des Kontextknotens sind. Beispiel: /Orte/*/Mensch; der Name des Parent-Nodes von Mensch ist unerheblich. Alternative: /Orte/child::*/child::Mensch
.//Mensch wählt alle Elemente mit dem Namen Mensch aus, die Nachkommen des Kontextknotens sind, unabhängig davon, auf welcher Ebene sich diese befinden. Beispiel: /Orte//Mensch. Alternative: /child::Orte/descendant::Mensch
Mensch/@vorname wählt das Attribut mit dem Namen vorname der Elemente mit dem Namen Mensch aus, die Kind-Elemente des Kontextknotens sind. Beispiel: /Orte/Ort/Mensch/@vorname. Alternative: /Orte/child::Ort/child::Mensch/attribute::vorname
@* wählt alle Attribute im Kontextknoten aus. Beispiel: /Orte/Ort/@*. Alternative: /Orte/child::Ort/attribute::*

XPath-Prädikate

Prädikate erlauben eine präzise Adressierung einzelner Elemente bzw. Attribute.

//Ort[1] adressiert das erste Element mit dem Namen Ort. Alternative: /Orte/Ort[position() = 1] oder head(/Orte/Ort) . //Mensch[1] würde jedoch eine Sequenz mehrerer Nodes ergeben, wenn es mehrere Ort-Nodes mit jeweils mehreren Childnodes Mensch gibt.
//Ort[id] Alle Elemente mit dem Namen Ort, die ein Kind-Element mit dem Namen id haben. Alternativen: //Ort[exists(id)] , //Ort[one-or-more(id)] oder //Ort[not(empty(id))]
//Ort[@name = 'Kapstadt'] Alle Elemente mit dem Namen Ort, die ein Attribut name besitzen, dessen Wert "Kapstadt" ist.
/Orte/Ort[Mensch] Alle Elemente Ort, die Kind-Elemente Mensch haben und direkt unterhalb des Rootnodes Orte liegen. Alternative: //Ort[one-or-more(Mensch)] oder //Ort[exists(Mensch)]
/Orte/Ort[1]/Mensch[2] Das 2. Mensch-Element vom 1. Ort-Kind-Element vom Rootnode Orte. Alternative: /Orte/Ort[position()=1]/Mensch[position()=2]
Ort[Mensch][2] Das 2. Element mit dem Namen Ort, das ein Unterelement Mensch besitzt. Alternative: Ort[exists(Mensch)][position()=2] oder auch Ort[exists(Mensch) and position()=2]
Ort[@name != 'Darmstadt'] Die Elemente mit dem Namen Ort, deren Attribut name nicht den Wert "Darmstadt" besitzt. Alternative: //Ort except //Ort[name = 'Darmstadt']
Ort[position() &lt; 3] Die Elemente mit dem Namen Ort, deren Position < 3 ist, also die Vorkommen 1 bis 2. Alternative: tail(/Orte/Ort)
Ort[position() != last()] Die Elemente mit dem Namen Ort, die nicht an letzter Position stehen, also die Vorkommen 1 bis n-1.
Ort[Mensch/@vorname = 'Lotte' or name = 'Neustadt'] Adressiert jene Elemente Ort, deren Childnode name den Wert "Neustadt" hat oder deren Childnode Mensch ein Attribut vorname mit Inhalt "Lotte" hat. Alternative: //Ort[Mensch[@vorname = 'Lotte'] union name[./text() = 'Neustadt']]

Beispiel: In dem XPath-Statement


/Orte/Ort[2]/Mensch[sum(Kauf/Gesamt) &lt; 500]

wird eine Nodeliste Mensch definiert, die aus dem 2. Ort kommen und die weniger als 500 ausgeben. Aus jedem Einzelnode dieser Liste kann auf dessen Childnodes vorname sowie alle Kauf/Gesamt zugegriffen werden, die wiederum werden.


<xsl:for-each 
     select="Orte/Ort[2]/Mensch[sum(Kauf/Gesamt) &lt; 500]">
  <xsl:value-of select="vorname" />
  <xsl:text>: </xsl:text>  
  <xsl:value-of select="sum(Kauf/Gesamt)" />
  <xsl:if test="position() != last()">
    <xsl:text>, </xsl:text>
  </xsl:if>
</xsl:for-each>

wg / 12. April 2018



Fragen? Anmerkungen? Tips?

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