Home
Über mich
Veröffentlichungen

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

XPath / 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.

Auf dieser Seite:
/ 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 aufsummiert 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? 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_Praedikate.html