Präsentationsfolien als pdf- File (268 KB)
1. Allgemeines
2. Knoten- Arten
3. Ausdrücke
3.1 Variablen
3.2 Funktionen
3.3 Lokationspfade
3.3.1 Achsen
3.3.2 Knotentest
3.3.3 Prädikate
3.3.4 Abkürzungen
4. XPath 2.0
5. Quellen
Warum gibt es XPath?
XPath wurde entwickelt um einzelne Teile eines XML- Dokumentes zu adressieren.
Somit ist es möglich Elemente oder vielmehr Elementgruppen auszuwählen und gezielt Werte verfügbar zu machen.
Die aktuelle Version XPath 1.0 wurde am 16.11.1999 vom W3C als Empfehlung herausgegeben. Es ist eine standardisierte Anfragesprache für XML- Dokumente und besitzt eine eigenständige Syntax. XPath ist nicht als Programmiersprache zu verstehen, sondern vielmehr ein Hilfsmittel für andere Anwendungen. Haupsächlich wird sie dabei von XSLT und XPointer verwendet. XPath operiert auf der abstrakten, logischen Struktur von XML- Dokumenten und baut diese baumartig auf. Dabei werden die einzelnen Verzweigungen Knoten, und mehrere Knoten Knotensätze (Knotenmengen) genannt. Es wird zwischen 7 verschiedenen Knoten unterschieden:
Knoten- Art | Bemerkungen |
Wurzelknoten (root) | Repräsentiert das gesamte XML- Dokument. Ist immer der erste Knoten im Baum. Besitzt als Zeichenkettenwert das, was nach dem Entfernen aller Tags, übrig bleibt. Hat keinen erweiterten Namen. |
Elementknoten (elem) | Alle 'normalen' Elemente. Besitzt als expanded-name den Name des Elementes in der Form namespace:elementname. Hat als Zeichenkettenwert den zusammengefassten Wert aller untergeordneter Textknoten. |
Kommentarknoten (comm) | Objekte der Form <!-- ... -->. Zeichenkettenwert ist Inhalt des Kommentars. Hat keinen erweiterten Namen. |
Textknoten (text) | Alle Zeichen ausserhalb spitzer Klammern. Zeichenkettenwert ist der Text selbst. Hat keinen erweiterten Namen |
Verarbeitungsanweisungsknoten (proc) | 'Processing-Instruction-Knoten' Objekte der Form <?proc-name ... ?>. Besitzt als expanded-name den proc-name und als string-value alles das, was dem proc-name folgt. |
Attributknoten (attr) | Jedes Attribut eines Elementknoten. Besitzt als expanded-name den Name des Attributs in der Form namespace:attribut. Der Zeichenkettenwert ist der Wert des Attributes. |
Namensraumknoten (name) | 'Namespace-Knoten' sind für jedes Element durch xmlns:name="URI" und name:element vorhanden. Besitzt als erweiterten Namen den namespace-identifier und als Zeichenkettenwert die namespace-URI. |
Ein Knoten wird im Baum immer in dem Format
index (typ) expanded-name "string-value"
angegeben.
<?xml version="1.0"?> |
1 (root) "Welch seltsames XML-Dokument" | 2 (proc) lala "bla=blu" | 3 (elem) http://www.TEST.de/:foo "Welch seltsames XML-Dokument" | 4 (name) ns "http://www.TEST.de/" | 5 (elem) http://www.TEST.de/:bar "Welch seltsames" | | | 6 (name) ns "http://www.TEST.de/" | | | 7 (attr) http://www.TEST.de/:attr1 "0815" | | | 8 (text) "Welch seltsames" | 9 (comm) "nicht einschlafen!" | 10 (text) "XML-Dokument" |
Ausdrücke, auch expressions genannt, sind das primäre, syntaktische Konstrukt in XPath. Sie werden oft in XML- Attributen, wie z.B. dem "match"- Attribut bei XSLT, eingesetzt. Dabei ist zu beachten, dass Sonderzeichen entsprechend in XML- Syntax geschrieben werden müssen. ('<'= <).
In XPath existieren 4 Datentypen:
node-set | Knotenmenge |
boolean | boolescher Wert (TRUE, FALSE) |
number | Gleitkommazahlen |
string | Zeichenkette |
strings | 'lala', 'foobar' |
Zahlen | Gleitkommazahlen |
Vereinigungen | '|' (z.B 2 Knotenmengen) |
logische Operatoren | '<' '>' '<=' '>=' '!=' '=' 'and' 'or' |
aritithmetische Operatoren | '+' '-' '*' div mod |
Gruppierungen | '(' ')' |
Variablen | $var |
Funktionen | position(), not(),... |
Lokalisierungspfade | /child::* |
In XPath ist es nicht möglich selbst eigene Variablen zu deklarieren. Dies muss von der entsprechenden Anwendung (z.B. XSLT) getan werden, welche XPath nutzt. Variable können aber in Ausdrücken vorkommen, müssen aber mit dem Dollar- Zeichen ('$') markiert sein.
$variablenname
In XPath gibt es eine überschaubare Funktionsbibliothek von insgesamt 50 Funktionen, die auf die 4 Datentypen aufgeteilt sind. Hier einige wichtige:
Funktionen auf Knotenmegen: | last(), position(), count() |
Zeichenkettenfunktionen: | concat(), contains(), translate(), string() |
Boolesche Funktionen: | not(), true(), false(), boolean() |
Zahlenfunktionen: | sum(), round(), number() |
Lokalisierungspfade sind die wichtigste Art eines Ausdruckes. Daher überhaupt der Name: XPath. Damit ist es möglich bestimmte Knoten aus einem Baum auszuwählen. Dabei wird immer schrittweise Vorgegangen. Allgemein ähnelt die Syntax sehr den Pfaden im Dateisystem von unixartigen Betriebssystemen. Man unterscheidet zwischen absoluten und relativen Lokalisierungspfaden. Bei einer absoluten Pfadangabe ist das erste Zeichen ein '/'. Das bedeutet, dass der Baum vom Wurzelknoten aus durchlaufen wird. Bei einer relativen Pfadangabe, durchläuft man den Baum von dem Knoten aus, wo man sich gerade befindet (Kontextknoten).
Ein Lokalisierungspfad kann nun aus einem Schritt oder aus mehreren Schritten zusammengesetzt sein. Dabei ist jeder einzelne Schritt folgendermassen aufgebaut.
Die Achse gibt das Verhältnis der auszuwählenden Knoten zum Kontextknoten an.
Achse | Knotenauswahl |
ancestor | alle Vorfahren |
ancestor-or-self | alle Vorfahren + selbst |
parent | Elternknoten |
self | Kontextknoten |
child | alle direkten Nachkommen * |
descendant | alle Nachkommen * |
descendant-or-self | alle Nachkommen + selbst |
following | alle in Dokumentenordnung folgenden Knoten ohne Nachkommen * |
following-sibling | alle nachfolgenden Geschwister * |
preceding | alle in Dokumentenordnung vorhergehenden Knoten ohne Vorfahren * |
preceding-sibling | alle vorhergehenden Geschwister * |
namespace | alle Namespace- Knoten des Kontextknoten |
attribute | alle Attribut- Knoten des Kontextknoten |
Abbildung: Veranschaulichung der Achsen
Die durch Achse ausgewählten Knoten werden geprüft, ob sie vom Typ knotentest sind. Jede Achse besitzt einen Hauptknotentyp. Für alle Achsen ist der Hauptknotentyp der Elementtyp, ausser für die Namespace- Achse der Namespacetyp und für die Attribute- Achse der Attributtyp.
Es gibt folgende Knotentests:
knotentest | erfüllt für... |
* | ...jeden Knoten des Hauptknotentyp |
text() | ...jeden Textknoten |
comment() | ...jeden Kommentarknoten |
processing-instruction() | ...jeden Verarbeitungsanweisungsknoten |
node() | ...jeden Knoten |
ns:name | ...jeden Knoten aus Namensraum ns mit Name name |
child::* | wählt alle Kind-Element-Knoten des Kontextknoten |
/descendant-or-self::node() | wählt alle Knoten des Dokuments |
attribute::ns:href | wählt alle href-Attribut-Knoten vom Namensraum ns des Kontextknoten |
Prädikate können optional in jedem Schritt angegeben werden. Sie filtern die Knotenmenge zusätzlich und schränken sie somit nochmals ein. Die Prädikate werden jeweils von links nach rechts abgearbeitet.
child::para[position()=last()] | wählt das letzte para-Kind-Element des Kontextknoten |
/child::doc/child::chapter[position()=5]/child::section[position()=2] | wählt das 2. section-Element des 5. chapter-Elementes des doc-Dokumenten-Elementes |
child::para[attribute::type='warning'][position()=5] | wählt aus den para-Kind-Elementen, welche ein Attribut mit type='warning' haben, das 5. aus |
child::*[self::chapter or self::appendix] | wählt alle chapter- und appendix-Kind-Elemente des Kontextknoten |
Für häufig benötigte Schritte sind folgende Abkürzungen verfügbar:
child:: | (wird weggelassen) |
attribute:: | @ |
self::node() | . |
parent::node() | .. |
/descendant-or-self::node()/ | // |
.//para
self::node()/descendant-or-self::node()/child::para
Beide Schreibweisen wählen jeweils alle para-Nachfahren-Elemente des Kontextknoten.
In Xpath 2.0 ist ein neuer Datentyp, nämlich der Sequenztyp hinzukommen. Dieser liefert bei jeder Operation eine Sequenz und kann Werte einfacher Typen oder Knoten enthalten. Auch neue Operatoren for, to sollen eingeführt werden, womit auch einige Anweisungen realisiert werden können (z.B.: for $x in (1 to 10) return $x*$x). Neben erweiterter Pfadausdrücke und zahlreichen neuen Funktionen, soll es möglich sein bedingte Ausdrüanzugeben (z.B.:if (@level) then @level else 5). Das Typsystem soll voraussichtlich dem, worauf XML Schema basiert, angepasst werden. Bis jetzt sind allerdings noch keine endgültigen Entscheidungen getroffen worden und weitere Änderungen in Planung.