info@a-coding-project.de

XPointer: Erweiterungen zu XPath

XPointer erweitert XPath , wie bereits angesprochen, um einige neue Funktionen und Typen. Dazu gehören die Typen point und range, sowie die Funktionen range-to(), string-range(), covering-range(), range-inside(), start-point(), end-point(), here() und origin().

Punkte und Bereiche

XPointer erweitert XPath um die Typen point (Punkt) und range (Bereich). Hiermit ist es möglich anstelle von ganzen Knoten auch eine bestimmte Stelle oder eben einen Bereich innerhalb eines Knotens (z.B. innerhalb des Elementinhaltes) oder über mehrere Knoten hinaus auszuwählen.

Ein Punkt kann durch eine feste Stelle (Zahl innerhalb von eckigen Klammern) oder eine der von XPointer zur Verfügung gestellten Funktionen ausgewählt werden. Soll beispielsweise die erste Stelle des Elementinhalts ausgewählt werden, kann dazu die folgende Schreibweise verwendet werden:

xpointer(id("elementname")[0])

Wie hier zu sehen ist, wird ein Punkt also immer dadurch bestimmt, in welchem Knoten er enthalten ist und welcher Stelle er darin angehört (also wie weit er vom Anfang des Knotens entfernt ist).

Ein Bereich wird immer durch zwei Punkte definiert: Einen Start- und einen Endpunkt. Beispiel:

xpointer(id("elementname")[0]/range-to(id("elementname2")[0]))

Im Beispiel wird mit der durch XPointer definierten Funktion range-to() gearbeitet. Wird diese verknüpft mit einem Punkt (also z.B. Punkt1/range-to(Punkt2)), so erhält man einen Bereich. Dabei ist zu beachten, dass, sofern der Elternknoten (also der Knoten in dem sich ein Punkt befindet) des einen Punktes kein Element-, Text- oder Rootknoten ist, der Elternknoten des anderen Punktes der gleiche Knoten sein muss. Das heißt: Liegt ein Anfangspunkt innerhalb einer Processing-Instruction, dann muss der Endpunkt auch innerhalb dieser PI liegen. Liegt der Anfangspunkt jedoch innerhalb eines Textknotens, kann sich der Endpunkt auch innerhalb eines anderen (Element-, Text- ...)Knoten befinden.

Funktionen

Die folgende Tabelle soll einen kurzen Überblick über die von XPointer definierten Funktionen bieten:

FunktionSyntaxBeispielBeschreibung
range-to()range-to(Position)xpointer(id('Start') / range-to(id('Ende')) )Erstellt eine Menge von Bereichen (range). Dazu wird ein Punkt erwartet der den Anfangspunkt des Bereiches darstellt, sowie ein Punkt innerhalb der Klammern, der den Endpunkt darstellen soll. Statt der Punktes kann auch ein Knoten fungieren von denen jeweils der Start- bzw. Endpunkt ausgewählt wird. Das Beispiel zeigt auf einen Bereich vom Element mit der ID start zum Element mit der ID Ende.
string-range()string-range(Position, String [, Index [, Index ] ])xpointer( string-range(//meinElement , "Such mich",9,5)[3] )Gibt eine Menge von Bereichen wieder. Dazu wird der in Position angegebene Knoten/Bereich nach dem Auftreten von String durchsucht. Jedes Vorkommen wird im Resultat aufgelistet. Der dritte und vierte Parameter ist optional. Der dritte definiert den Startindex der Suche - der vierte die Länge des zu durchsuchenden Bereiches. Das Beispiel zeigt auf das dritte Vorkommen von 'Such mich' innerhalb vom Element meinElement.
covering-range()covering-range(Position)covering-range(//meinElement)Gibt eine Menge von Bereichen wieder, die der Definition entsprechen. Dazu wird zu jedem der Position entsprechenden Knoten, Punkten oder Bereiche eine "Umrandung" verliehen, die ausgegeben wird. Dies geschieht wie folgt:
Bei Bereichen wird der Bereich selbst ausgegeben. Bei Punkten wird ein leerer Bereich ausgegeben, der als Start- und Endpunkt eben diesen Punkt besitzt. Bei Element-, Text-, Kommentar-, Root- und PI-Knoten wird der Start- und Endpunkt des Bereiches gleichgesetzt mit dem Anfang und Ende des jeweiligen Knotens. Bei Attribut- oder Namespace-Knoten wird als Bereich das Attribut bzw. der Namespace selbst wiedergegeben.
range-inside()range-inside(Position)range-inside(//meinElement)Gibt eine Menge an Bereichen wieder. Für jeden durch die Definition gegebenen Position wird dabei ein Eintrag in das Resultat geschrieben. Handelt es sich dabei um einen Bereich oder Punkt, wird dieser wie bei covering-range() übernommen. Handelt es sich dabei um einen Knoten, so wird nur dessen Inhalt aufgenommen, sofern dieser Textinhalt besitzt.
start-point()start-point(Position)xpointer(start-point(//Start) / range-to(id('Ende')) )Gibt eine Menge von Punkten aus, die den Anfangspunkten von Position entsprechen.
end-point()end-point(Position)xpointer(id('Start') / range-to(end-point(//Ende)) )Gibt eine Menge von Punkten aus, die den Endpunkten von Position entsprechen.
here()here()xpointer(here()/range-to(id('Ende')))Diese Funktion kann nur dann verwendet werden, wenn sie sich innerhalb des zu interpretierenden XML-Dokuments befindet. Sie gibt, befindet sie sich innerhalb eines Textknotens, den Elementknoten des Elternelements wieder. Befindet sie sich innerhalb eines anderen Knotens, wird dieser ausgegeben.
origin()origin()xpointer(origin())Diese Funktion kann nur dann verwendet werden, wenn sie im Zusammenhang mit einer, z.B. mittels XLink definierten, Traversierung eines Links verwendet wird. Die Funktion verweist damit auf den Quell-Link (also dessen Element/e), der die Traversierung ausgelöst hat.

Weiterlesen: ⯈ Sprachschatz

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant