XPath: Umsetzung


... [ Seminar XML ] ... [ XLink, XPath & XPointer ] ... [ XML Pointer Language (XPointer) ] ...

Übersicht: XPath Umsetzung


Location Paths

Die Adressierung der einzelnen Elemente des Baums erfolgt bei XPath mittels sogenannter "Location Paths".
Location Paths wählen nach bestimmten Kriterien Knoten aus dem Baum aus. So ist es auch möglich, daß ein Location Path mehr als ein Element zurückliefert.
Ein Location-Path wird immer innerhalb eines vorher definierten Kontextes ausgewertet. Dieser umfaßt: Ein Location Path ist folgendermaßen aufgebaut:

   [/]schritt(/schritt)*

Die Verarbeitungsweise ist ähnlich wie bei Pfaden im Dateisystem:

Ein Schritt im Location Path wählt aber nicht wie im Dateisystem einen bestimmten Unterknoten aus, sondern ist wie folgt aufgebaut:

   achse::typ([prädikat])*

achse gibt dabei das Verhältnis der gewünschten Knoten zum Kontextknoten an. Mögliche Werte sind:

child Alle direkten Nachkommen des Knotens, aber keine Attribute.
descendant Alle Nachkommen des Knotens, aber keine Attribute.
descendant-or-self Alle Nachkommen des Knotens, inklusive er selbst, aber keine Attribute.
attribute Alle Attribute (außer Namespaces), die direkte Nachkommen des Knotens sind.
namespace Alle Namespace-Attribute, die direkte Nachkommen des Knotens sind.
parent Den Vater des aktuellen Knotens.
ancestor Alle Väter des Knotens.
ancestor-or-self Alle Vorfahren des Knotens, inklusive er selbst.
following-sibling Den folgenden Bruder.
preceding-sibling Den vorhergehenden Bruder.
following Alle folgenden Knoten, die keine Nachkommen des Knotens sind.
preceding Alle vorhergehenden Knoten, die keine Nachkommen des Knotens sind.
self Der aktuelle Knoten.

Für jeden der durch achse ausgewählten Knoten wird geprüft, ob er vom angegebenen typ ist. Mögliche Werte sind:

* Alle Knoten vom typ der Achse. Der Achsentyp ist immer Element außer bei attribute und namespace.
namespace:* Alle Knoten im Namespace namespace
namespace:typ Alle Knoten mit Namen namespace:typ
typ Alle Knoten mit Namen typ und NULL-Namespace
text() Alle Textknoten
comment() Alle Kommentarknoten
processing-instruction() Alle Processing-Instruction-Knoten
processing-instruction(name) Alle Processing-Instruction-Knoten mit Expanded-Name name
node() Alle Knoten

Für alle Knoten, die jetzt noch ausgewählt sind, werden (falls vorhanden) die prädikate ausgewertet.
Die Prädikate sind XPath-Ausdrücke, deren genauer Aufbau unten erläutert wird.
Ein Knoten bleibt ausgewählt, wenn keine Prädikate angegeben sind oder für jedes Prädikat gilt:

Die Position eines Knotens in der Auswahl ist die Entfernung vom Kontextknoten. Der Knoten, der am nächsten beim Kontextknoten liegt, hat die Position 1, alle anderen Knoten werden aufsteigend numeriert.

Jeder der so ausgewählten Knoten dient als Ausgangsknoten für den folgenden Schritt im Location Path.

Für häufig gebrauchte Schritte sind Abkürzungen definiert:

child::   child:: kann weggelassen werden, text() bedeutet dasselbe wie child::text()
attribute:: @ attribute:: kann durch @ abgekürzt werden; @href bedeutet dasselbe wie attribute::href
self::node() . Den aktuellen Knoten kann man mit . bezeichnen.
parent::node() .. Den übergeordneten Knoten kann man mit .. referenzieren
/descendant-or-self::node()/ // Einen Knoten sowie alle seine Nachkommen wählt man mit einem einfachen // aus.

Nach oben

Location Path-Beispiele

Bei den folgenden Beispielen wird jeweils zunächst die abgekürzte (falls vorhanden) und dann die ausgeschriebene Form angegeben.

text()
child::text()
Dieser Location-Path wählt alle Textelemente aus, die direkte Nachkommen des Kontextknotens sind.

/html
/child::html
Wählt das html-Element aus, das ein Kind des Wurzelknotens sein muß.

//table
/descendant-or-self::node()/child::table
Wählt alle table-Tags im Dokument aus.

../table/@width
/parent::node()/child::table/attribute::width
Wählt die WIDTH-Attribute aller Tabellen aus, die Kinder des übergeordneten Knotens sind.

following-sibling::*/tr/td
following-sibling::*/child::tr/child::td
Wählt alle TD-Elemente aus, die innerhalb eines TR-Elements stehen, das in einem Bruderelement des aktuellen Elements steht.

Nach oben

Ausdrücke

Ausdrücke in XPath liefern Resultate, die einem der folgenden Typen angehören:

node-set Eine (ggf. auch leere) Menge von Knoten
boolean Ein boolescher Wert (TRUE oder FALSE)
number Eine Fließkommazahl
string Ein string

In Ausdrücken dürfen folgende Elemente verwendet werden:

Element Beispiel Typ
Klammerung ( ... )  
Strings "text" 'text' string
Zahlen 1 1.2 .1 number
Arithmetik + - * div mod number
Logik <= < >= > = != and or boolean
Location-Paths /schritt1/schritt2 node-set
Vereiningungsmenge location-path | location-path node-set
Variablen $Variablenname (Typ der Variablen)
Funktionsaufrufe funktion() (Typ der Funktion)

Nach oben

Funktionen

Von XPath definierte Funktionen:

Typ Aufruf Beschreibung
node-set-Funktionen
number last() Gibt die Nummer des letzten Knotens (= Anzahl der Knoten) im Kontext zurück
number position() Gibt die Nummer des aktuellen Knotens im Kontext zurück
number count(node-set) Gibt die Anzahl der Knoten im Argument zurück
node-set id(object) Gibt das Element mit der Unique-ID object zurück
string local-name(node-set?) Liefert den lokalen Namen eines Knotens
string namespace-uri(node-set?) Liefert den namespace-URI eines Knotens
string name() Gibt den kompletten Namen eines Knotens zurück
string-Funktionen
string string(object?) Wandelt das Argument in einen string
string concat(string, string, string*) Gibt die Aneinanderreihung der Argumente zurück
boolean starts-with(string, string) Gibt TRUE zurück, wenn der erste string mit dem zweiten beginnt
boolean contains(string, string) Gibt TRUE zurück, wenn der zweite string im ersten enthalten ist
string substring-before(string, string) Gibt den string zurück, der vor dem ersten Auftreten des zweiten im ersten string liegt.
string substring-after(string, string) Gibt den string zurück, der hinter dem ersten Auftreten des zweiten im ersten string liegt.
string substring(string, number, number?) Gibt den string mit länge der zweiten Zahl zurück, der an der durch die erste nummer angegebenen position beginnt.
number string-length(string?) Gibt die Länge des strings zurück.
string normalize-space(string?) Entfernt Whitespaces am Anfang un Ende, sowie aufeinanderfolgende Whitespaces.
string translate(string, string, string) Ersetzt alle Vorkommen des zweiten strings im ersten durch den dritten
boolean-Funktionen
boolean boolean(object) Wandelt das Argument in ein boolean
boolean not(boolean) Führt eine not-Operation auf dem Argument aus
boolean true() Ergibt TRUE
boolean false() Ergibt FALSE
boolean lang(string) Gibt TRUE zurück, wenn die Sprache des Kontextknotens die durch string angegebene ist
number-Funktionen
number number(object) Wandelt das Argument in eine Zahl
number sum(node-set) Summiert alle in Zahlen konvertierten Knoten
number floor(number) Gibt die ganze Zahl zurück, die größer oder gleich dem Argument ist
number ceiling(number) Gibt die ganze Zahl zurück, die kleiner oder gleich dem Argument ist
number round(number) Rundet das Argument kaufmännisch

Nach oben

Beispiele für Ausdrücke

/html/body/table[2]
/child::html/child::body/child::html[2]
Die zweite Tabelle, die direkt im Body steht (keine geschachtelten Tabellen).

//table[@width = "50%"]
/descendant-or-self::table[attribute::width = "50%"]
Alle Tabellen im Dokument, die "50%" als Breite angegeben haben.

//td[position() != last()]
Alle TD-Elemente im Dokument mit Ausnahme des letzten.

//ex:head
Alle HEAD-Elemente, die im Namespace ex deklariert sind.

Stand der Link //ex:head in einem Dokument, in dem ex mit dem Namespace "http://www.example.org" verknüpft war, und man kopiert den Link in ein anderes Dokument, in dem "http://www.example.org" mit einem anderen Präfix verknüpft ist, so funktioniert der Link nicht mehr. Um dies zu vermeiden, kann man den Link auch allgemeiner formulieren:
//*[local-name() = 'head' and namespace-uri() = 'http://www.example.org']
Allgemeinere Form von //ex:head, wenn ex als xmlns:ex="http://www.example.org" deklariert wurde.

Nach oben

... [ Seminar XML ] ... [ XLink, XPath & XPointer ] ... [ XML Pointer Language (XPointer) ] ...