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 auszuwä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 verwendeten 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 Nodeset, 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 Knotenmenge 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 relativen und absoluten Pfadausdrücken.
- Ein relativer Pfadausdruck setzt stets am aktuellen Kontextknoten an.
Seine Ergebnissequenz ist daher kontextabhängig; eine erneute Auswertung des relativen Pfadausdrucks mit geändertem Kontextknoten ergibt stets eine neue Ergebnissequenz. Hier ein schematisches Beispiel für einen relativen Pfadausdruck:
step_1/step_2/step_3
- Ein absoluter Pfadausdruck setzt dagegen am Dokumentknoten an.
Die durch ihn erzeugte Ergebnissequenz ist kontextunabhängig, also losgelöst von der Position des aktuellen Knotens im Dokumentbaum. Eine erneute Auswertung des absoluten Pfadausdrucks mit geändertem Kontextknoten 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 Ausdruck 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 hintereinander liegende Nodes eingehen, da jeweils der gesamte Zweig geprüft wird. Auch die Knoten der von step_1 zusammengestellten primären Sequenz, also die Wurzelknoten 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