XML Pointer Language (XPointer)


... [ Seminar XML ] ... [ XLink, XPath & XPointer ] ... [ Weitere Möglichkeiten ] ...

Übersicht: XPointer


Konzept

XPointer definiert eine auf XPath [5] aufbauende Sprache, die in URIs [10] verwendet werden kann, um Teile eines XML-Dokuments zu adressieren.
XPointer bietet drei verschiedene Formen zur Adressierung von Dokumentteilen: Bare-Names, Child Sequence und Full XPointer.
XPointer definiert darüberhinaus einige Erweiterungen zu XPath, die im folgenden kurz vorgestellt werden.

Nach oben

Erweiterungen zu XPath

Werden Location-Paths in XPointer verwendet, so ist es erlaubt, Achse und Typ auszulassen und statt dessen direkt ein Prädikat anzugeben:

  /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)
Mit range-to wird ein Bereich ausgewählt, der sich vom Kontextknoten bis zur angegebenen Location erstreckt.

  //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)
Mit string-range kann ein Textbereich ausgewählt werden. string-range arbeitet dabei auf dem string-value des durch location angegebenen Elements.

  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>

Nach oben

Bare-Names

Es ist möglich, ein Element direkt über seine Unique ID [1] anzuspringen. Enthält das Dokument "test.xml" z. B. ein Element

   <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

Nach oben

Child Sequence

Desweiteren besteht die Möglichkeit, ein Element mittels Indexzahlen anzuspringen. Die URL

   #/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

Nach oben

Full XPointer

Ein kompletter XPointer setzt sich wie folgt zusammen:

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

Nach oben

... [ Seminar XML ] ... [ XLink, XPath & XPointer ] ... [ Weitere Möglichkeiten ] ...