XPointer in URLs

(Auszug aus "XML in a Nutshell" von Elliotte Rusty Harold & W. Scott Means)

Eine URL, die ein Dokument identifiziert, sieht etwa so aus: "http://java.sun.com:80/products/jndi/index.html". Das Schema in diesem Beispiel, http, sagt Ihnen, welches Protokoll die Anwendung einsetzen sollte, um das Dokument zu beziehen. Die Quelle, in diesem Beispiel java.sun.com:80, gibt an, von welchem Host die Anwendung das Dokument beziehen soll. Die Quelle kann auch den Port, zu dem auf diesem Host die Verbindung geöffnet werden soll, sowie den zu verwendenden Benutzernamen und das dazugehörende Passwort enthalten. Der Pfad, /products/jndi/index.html in diesem Beispiel, legt fest, nach welcher Datei in welchem Verzeichnis auf dem Server gesucht werden soll. Das muss nicht unbedingt eine echte Datei in einem tatsächlichen Dateisystem sein, es sollte sich aber um ein vollständiges Dokument handeln, von dem der Server weiß, wie er es erzeugen und zurückgeben kann. Sie sind mit all dem bereits vertraut, und durch XPointer ändert sich auch nichts daran.

Vermutlich wissen Sie auch bereits, dass einige URLs Fragmentbezeichner enthalten, die auf einen bestimmten benannten Anker innerhalb des Dokuments zeigen, das die URL bezeichnet. Die Raute # trennt diesen Anker vom Pfad. Hätten wir z.B. in die gezeigte URL das Fragment download eingefügt, würde sie so aussehen: "http://java.sun.com:80/products/jndi/index.html#download". Wenn ein Webbrowser einem Link zu dieser URL folgt, sucht er in dem Dokument unter "http://java.sun.com:80/products/jndi/index.html" nach einem benannten Anker mit dem Namen download, der etwa so aussieht:

<a name="download"></a>

Er würde das Browser-Fenster dann auf die Position in dem Dokument verschieben, an der der Anker mit diesem Namen gefunden wird. Das ist ein einfaches und klares System und reicht für die einfachen Ansprüche von HTML aus. Es besitzt jedoch einen entscheidenden Nachteil: Damit Sie auf eine bestimmte Stelle eines bestimmten Dokuments verweisen können, müssen Sie die Möglichkeit besitzen, das Dokument zu ändern, zum dem Sie linken, um an der gewünschten Stelle einen benannten Anker einzufügen. XPointer bemüht sich, diese Beschränkung aufzuheben, indem es Autoren mit Hilfe vollständiger XPath-Ausdrücke als Fragmentbezeichner ermöglicht festzulegen, wohin sie einen Link richten wollen. XPointer erweitert darüber hinaus XPath dahingehend, dass es Operationen zur Verfügung stellt, um bestimmte Punkte oder Bereiche in einem XML-Dokument auszuwählen, die nicht unbedingt mit einem Knoten oder einer Knotenmenge übereinstimmen. Zum Beispiel kann ein XPointer einen Textbereich beschreiben, der gerade mit der Maus ausgewählt wurde.

Die einfachste Form eines XPointer ist einfach ein XPath-Ausdruck – oft, aber nicht notwendigerweise ein Lokalisierungspfad –, der in die Klammern von xpointer( ) eingeschlossen ist. Dies sind beispielsweise alles zulässige XPointer:

xpointer(/)
xpointer(//vorname)
xpointer(id('sec-intro'))
xpointer(/leute/person/name/vorname/text( ))
xpointer(//mittelinitial[position( )=1]/../vorname)
xpointer(//beruf[.="Physiker"])
xpointer(/child::leute/child::person[@index<4000])
xpointer(/child::leute/child::person/attribute::id)

Nicht alle diese XPointer verweisen unbedingt auf ein einzelnes Element. Je nachdem, in Bezug auf welches Dokument ein XPointer bewertet wird, kann ein XPointer keinen, einen oder mehr als einen Knoten identifizieren. Am häufigsten handelt es sich bei den identifizierten Knoten um Elemente, es können aber auch Attributknoten oder Textknoten sowie Punkte bzw. Bereiche sein.

Wenn Sie unsicher sind, ob ein bestimmter XPointer etwas findet, können Sie ihn mit einem alternativen XPointer absichern. Dieser XPointer beispielsweise sucht als Erstes nach vorname-Elementen. Wenn er keine findet, sucht er nachname-Elemente:

xpointer(//vorname)   xpointer(//nachname)

Die nachname-Elemente werden nur dann gefunden, wenn keine vorname-Elemente vorhanden sind. Sie können so viele dieser XPointer aneinander ketten, wie Sie möchten. Dieser XPointer z.B. sucht als Erstes nach vorname-Elementen. Findet er keine, macht er sich auf die Suche nach nachname-Elementen. Wenn er auch von diesen keine findet, sucht er nach Mittelinitialen. Wenn auch diese Suche vergeblich war, gibt er eine leere Knotenmenge zurück:

xpointer(//vorname)    xpointer(//nachname)    xpointer(//mittelinitial)

Zwischen den einzelnen xpointer( )-Teilen ist kein besonderes Trenn- oder Whitespace-Zeichen erforderlich, erlaubt ist zusätzlicher Whitespace aber. Dieser XPointer bedeutet dasselbe wie der obige:

xpointer(//vorname)    xpointer(//nachname)    xpointer(//mittelinitial)

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

  


Copyright © 2005 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XML in a Nutshell" 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.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de