Sommersemester 2004

Proseminar: XML- basierte Technologien

XPath



Präsentationsfolien als pdf- File (268 KB)

Gliederung:

 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

1. Allgemeines

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:


2. Knoten- Arten

Knoten- ArtBemerkungen
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.
Der index ist eine fortlaufende Zahl, wobei der Wurzelknoten immer '1' als index besitzt.
Als nächstes wird der Knotentyp (typ) und ein "erweiterter Name" (expanded name) beschrieben, wobei nicht jeder Knotentyp einen expanded name besitzt. Jeder Knoten besitzt einen Zeichenkettenwert (string value). Siehe obere Tabelle zu Knoten- Arten.

Beispiel:

<?xml version="1.0"?>
<?lala bla=blu?>
<!DOCTYPE foo PUBLIC "foo.dtd">
<ns:foo xmlns:ns="http://www.TEST.de/">
<ns:bar ns:attr1="0815">
Welch seltsames
</ns:bar>
<!-- nicht einschlafen! -->
XML-Dokument
</ns:foo>
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"

Im Baum werden weder die 1.Zeile (xml version), noch die Dokumententypdeklararion (3.Zeile) dargestellt.


3. Ausdrücke

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. ('<'= &lt;).
In XPath existieren 4 Datentypen:

node-setKnotenmenge
booleanboolescher Wert (TRUE, FALSE)
numberGleitkommazahlen
stringZeichenkette

Somit müssen auch die Resultate der Ausdrücke von einem der genannten Datentypen sein. Ausdrücke können aus folgenden bestehen:

strings'lala', 'foobar'
ZahlenGleitkommazahlen
Vereinigungen'|' (z.B 2 Knotenmengen)
logische Operatoren'<' '>' '<=' '>=' '!=' '=' 'and' 'or'
aritithmetische Operatoren'+' '-' '*' div mod
Gruppierungen'(' ')'
Variablen$var
Funktionenposition(), not(),...
Lokalisierungspfade/child::*


3.1. Variablen

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.

Beispiel:

$variablenname


3.2. Funktionen

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()


3.3. Lokalisierungspfade

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).


absolut:  /schritt1/schritt2
relativ:   schritt1/schritt2

Ein Lokalisierungspfad kann nun aus einem Schritt oder aus mehreren Schritten zusammengesetzt sein. Dabei ist jeder einzelne Schritt folgendermassen aufgebaut.

achse::knotentest[prädikat1][prädikat2]...


3.3.1 Achse

Die Achse gibt das Verhältnis der auszuwählenden Knoten zum Kontextknoten an.

AchseKnotenauswahl
ancestoralle Vorfahren
ancestor-or-selfalle Vorfahren + selbst
parentElternknoten
selfKontextknoten
childalle direkten Nachkommen *
descendantalle Nachkommen *
descendant-or-selfalle Nachkommen + selbst
followingalle in Dokumentenordnung folgenden Knoten ohne Nachkommen *
following-siblingalle nachfolgenden Geschwister *
precedingalle in Dokumentenordnung vorhergehenden Knoten ohne Vorfahren *
preceding-siblingalle vorhergehenden Geschwister *
namespacealle Namespace- Knoten des Kontextknoten
attributealle Attribut- Knoten des Kontextknoten
* ausser Namespace-Knoten und Attribut-Knoten


Abbildung: Veranschaulichung der Achsen



3.3.2. Knotentest

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:

knotentesterfü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

Beispiele:

child::*wählt alle Kind-Element-Knoten des Kontextknoten
/descendant-or-self::node()wählt alle Knoten des Dokuments
attribute::ns:hrefwählt alle href-Attribut-Knoten vom Namensraum ns des Kontextknoten


3.3.3. Prädikate

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.

Beispiele:

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


3.3.4. Abkürzungen

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()///

Beispiele:

.//para
self::node()/descendant-or-self::node()/child::para

Beide Schreibweisen wählen jeweils alle para-Nachfahren-Elemente des Kontextknoten.


4. XPath 2.0

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.



5. Quellen



Sommersemester 2004
TU- Chemnitz
Proseminar: XML-basierte Technologien (XPath)
Christian Vogel
12.06.04