/id("4711") statt
/*[id("4711")]
XPointer führt als Ergebnistyp zusätzlich das "Location-Set" ein. Ein Location-Set erweitert ein Node-Set dahingehend, daß nun auch benutzerdefinierte Auswahlen wie z. B. "vom dritten Wort des ersten Absatzes bis zum fünften Wort des vorletzten Absatzes" möglich sind.
Mit XPath-Ausdrücken war das nicht umzusetzen, da Textelemente immer als ein einzelner Knoten angesehen wurden.
XPointer definiert dafür zwei zusätzliche Funktionen:
range-to(location)
//p[2]/range-to(following::div)
Dieser Ausdruck wählt alles vom zweiten P-Element bis zum darauffolgenden DIV-Element aus.
string-range(location, string, number, number)
string-range(//p, "Ziel", 1, 3)
Dieser Ausdruck wählt alle Vorkommnisse von "Zie" innerhalb aller P-Tags aus, die von einem "l" gefolgt werden.
Da die Funktion auf dem string-value der P-Tags arbeitet, findet sie auch Texte, die im XML-Code wie folgt aussehen:
<p>Text ... Z<b>ie</b>l ... Text</p>
<elem id="label1">
,
so kann man das Element, ähnlich wie in HTML [12], direkt referenzieren durch z. B.:
http://www.fh-wedel.de/dir/test.xml#label1
#/1/2/3
wählt das dritte Subelement (zielelem) des zweiten Subelements (element2) des Document-Elements (main) im folgenden Dokument aus:
<?xml version="1.0"?> <main> <element1 xmlns:myns="http://abcd.org" attr1="123"> <subelem1>Text 1</subelem1> </element1> <element2 attr2="test2" id="intro"> <subelem1>blabla 1</subelem1> <subelem1>blabla 2</subelem1> <zielelem>Text 2</zielelem> </element2> <element1 attr2="test2"> <subelem1>Text 3</subelem1> </element1> </main>
Kombination von Bare-Names und Child sequence sind möglich. Das selbe Element wird über folgenden URL ausgewählt:
#intro/3
Schema(Ausdruck)
wobei für Schema zur Zeit nur "xpointer" definiert ist. Beim Schema "xpointer" ist "Ausdruck" ein XPointer-Ausdruck, d. h. ein XPath-Konstrukt mit XPointer-Erweiterungen.
Es können mehrere XPointer nebeneinander stehen, die dann von links nach rechts ausgewertet werden. Ist ein XPointer ungültig oder referenziert eine nicht vorhandene Ressource, so wird der nächste ausgewertet. Der erste XPointer, der erfolgreich dereferenziert wird, wird dann verwendet.
Im folgenden Fall wird erst der letzte XPointer verwendet:
#blabla(test)xpointer(nicht_da)xpointer(/descendant-or-self::*[@type = '2'])
Bare-Names und Child sequence können auch durch Full XPointer dargestellt werden:
#intro
ist äquivalent zu
#xpointer(//id("intro"))
#intro/2
ist äquivalent zu
#xpointer(//id("intro")/*[2])
#/1/2
ist äquivalent zu
#xpointer(/*[1]/*[2])