Pfadausdrücke: Grundlagen

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 4.)

Eine Grundfunktionalität von XPath besteht darin, innerhalb einer Baumstruktur die gewünschte Knotenmenge zu lokalisieren und in Form einer Sequenz auszu­wählen. Ein Pfadausdruck gibt allerdings keine atomaren Werte zurück, sodass die Ergebnissequenz stets eine reine Nodesequenz sein wird. (Oder die leere Sequenz, falls kein Knoten den Ausdruck erfüllt. Analog ergibt ein Pfadausdruck in XPath 1.0 einen leeren Nodeset zurück.) Die hierfür ver­wendeten Ausdrücke werden als Pfadausdrücke (path expressions) bezeichnet.

Pfadausdruck in XPath 1.0 und XPath 2.0

In XPath 1.0 ist das Ergebnis eines Pfadausdrucks generell ein Nodeset. Obwohl Nodesets per Definition »ungeordnet« sind, geschieht ihre Abarbeitung dennoch in einer vorgegebenen Reihenfolge. Diese entspricht der Dokumentreihenfolge, wie sie durch das verarbeitete XML-Dokument vorgegeben ist.

In XPath 2.0 ist das Ergebnis eines Pfadausdrucks eine Sequenz, die als solche stets als »geordnet« bezeichnet wird. Ihre Verarbeitung ist demzufolge eigentlich von der Dokumentreihenfolge der in ihr repräsentierten Knoten gelöst und hängt ausschließlich von der Sequenzreihenfolge ab.

Um allerdings die Abwärtskompatibilität zwischen Pfadausdrücken in XPath 2.0 und XPath 1.0 zu gewährleisten, wurde festgelegt, dass die Reihenfolge der Knoten innerhalb der Sequenz ebenfalls der Dokumentreihenfolge entsprechen soll und eventuell doppelt auftretende Knoten aus der Sequenz entfernt werden.

Gleiche Pfadausdrücke haben in XPath 1.0 und 2.0 gleiche Ergebnisse
In diesem Sinne entspricht die durch einen Pfadausdruck in XPath 2.0 erzeugte Nodesequenz dem aus demselben Ausdruck in XPath 1.0 resultierenden Node­set, sofern der Ausdruck dort ebenfalls formulierbar ist.

Pfadausdrücke allgemein betrachtet

Ein Pfadausdruck besteht aus mindestens einem Schritt (Location Step). Eine Folge aus mehreren Schritten werden durch den Pfadoperator »/« getrennt. Jeder Schritt wählt eine Knotenmenge und folgt hierbei einer »Achse«. Unter einer Achse versteht man eine der möglichen Bewegungsrichtungen in einer Baumstruktur.

Ein Schrittausdruck ist daher in sich ebenfalls untergliedert, und zwar in einen Achsenbezeichner und einen weiteren Teilausdruck, der die gewünschte Knoten­menge spezifiziert. Dieser sogenannte Nodetest kann noch durch zusätzliche Filterbedingungen (Predicates) verfeinert werden:

achsenbezeichner::nodetest[predicate]

Bevor wir einen näheren Blick auf Achsen und anschließend auf die Schritte als Gesamtheit werfen, befassen wir uns zunächst mit dem zugrunde liegenden Prinzip des Pfadausdrucks.

Relative und absolute Pfadausdrücke

Je nachdem, wo ein Pfadausdruck ansetzt, unterscheidet man zwischen relati­ven und absoluten Pfadausdrücken.

  • Ein relativer Pfadausdruck setzt stets am aktuellen Kontextknoten an.

    Seine Ergebnissequenz ist daher kontextabhängig; eine erneute Auswer­tung des relativen Pfadausdrucks mit geändertem Kontextknoten ergibt stets eine neue Ergebnissequenz. Hier ein schematisches Beispiel für einen relati­ven Pfadausdruck:

    step_1/step_2/step_3

  • Ein absoluter Pfadausdruck setzt dagegen am Dokumentknoten an.

    Die durch ihn erzeugte Ergebnissequenz ist kontextunabhängig, also losge­löst von der Position des aktuellen Knotens im Dokumentbaum. Eine erneute Auswertung des absoluten Pfadausdrucks mit geändertem Kontext­knoten ergibt stets dieselbe Ergebnissequenz. Ein absoluter Pfadausdruck beginnt mit dem Pfadoperator selbst:

    /step_1/step_2/step_3

Der Doppelslash im Pfadausdruck

Der Doppelslash ist innerhalb eines Pfadausdrucks ein eigener Aus­druck für sich. Er entspricht also nicht etwa zwei aufeinander folgenden einfachen Pfadoperatoren, sondern in etwa der nachfolgend beschriebenen »Descendant-Or-Self«-Achse.

Besonderheit: Die auf einen doppelten Slash »//« folgenden Schritte können beliebig tief im Dokumentbaum ansetzen.

Der Doppelslash kann sowohl am Anfang des Pfadausdrucks stehen

//step_1/step_2/step_3

als auch zwischen zwei Steps:

step_1/step_2//step_3

Steht der Ausdruck am Anfang eines Pfadausdrucks, so markiert dies genauso einen absoluten Pfad wie der einleitende einfache Slash.

So stellt //step_1 eine Sequenz aus allen Knoten unterhalb des Dokumentknotens zusammen, die step_1 erfüllen. Die gefundenen Knoten können also in beliebiger Tiefe im Dokumentbaum liegen. (Auch der Dokumentknoten selbst kann dazugehören, wenn er dem Nodetest des Schrittes entspricht.)

Der in der Interpretation etwas komplexere Ausdruck step_1//step_2 fordert zunächst, ausgehend vom Kontextknoten, die Erfüllung von step_1. Hierbei wird eine primäre Nodesequenz gebildet, und nachfolgend alle von deren Mitgliedsknoten ausgehenden Dokumentzweige nach Nodes untersucht, die wiederum step_2 erfüllen. Es wird also jeder Knoten der primären Sequenz als Wurzelknoten eines von ihm abstammenden Zweiges betrachtet.

In die Ergebnismenge können, sofern sie den Nodetest erfüllen, pro Zweig auch mehrere hintereinan­der liegende Nodes eingehen, da jeweils der gesamte Zweig geprüft wird. Auch die Kno­ten der von step_1 zusammengestellten primären Sequenz, also die Wurzel­knoten der geprüften Zweige, werden für die Ergebnismenge berücksichtigt (sofern sie gleichfalls den Nodetest von step2 erfüllen). Die Menge aller erfolgreich getesteten Knoten bildet schließlich die Ergebnissequenz.

   

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XPath bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn