Punkte

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

XPaths, Kurzform-Pointer und Kindfolgen können nur auf vollständige Knoten oder Knotenmengen verweisen. Manchmal jedoch wollen Sie auf etwas zeigen, das kein Knoten ist, etwa auf das dritte Wort des dritten Absatzes oder das Jahr in einem datum-Attribut, das so aussieht: datum="01/03/1950". Um dies zu ermöglichen, erweitert XPointer das XPath-Datenmodell um Punkte und Bereiche. Ein Punkt ist die Position, die einem Tag, einem Kommentar, einer Verarbeitungsanweisung oder einem Zeichen in einem #PCDATA-Abschnitt vorausgeht oder folgt. Punkte können auch Positionen innerhalb von Kommentaren, Verarbeitungsanweisungen oder Attributwerten sein. Punkte können nicht innerhalb einer Entity-Referenz gesucht werden, innerhalb des Ersetzungstextes eines Entity dagegen schon. Ein Bereich ist eine Abfolge von geparsten Zeichendaten zwischen zwei Punkten. Knoten, Punkte und Bereiche werden zusammen Orte genannt; eine Menge, die Knoten, Punkte und Bereiche enthalten kann, wird Lokalisierungsmenge genannt. Anders ausgedrückt: Ein Ort ist eine Verallgemeinerung des XPath-Knotens, die Punkte und Bereiche sowie Elemente, Namensräume, Textknoten, Kommentare, Verarbeitungsanweiungen und den Wurzelknoten enthält.

Ein Punkt wird durch seinen Containerknoten und einen nicht-negativen Index in diesen Knoten identifiziert. Wenn der Knoten Kindknoten enthält – d.h., wenn er ein Wurzel- oder Elementknoten ist –, dann existieren vor und hinter jedem seiner Kinder Punkte (außer an den Enden, an denen der Punkt hinter einem Kindknoten mit dem Punkt vor dem nächsten Kindknoten zusammenfällt). Enthält der Knoten – wie ein Kommentar-, Verarbeitungsanweisungs-, Attribut-, Namensraum- oder Textknoten – keine Kindknoten, gibt es einen Punkt vor und hinter jedem Zeichen im String-Wert des Knotens, wobei der Punkt hinter einem Zeichen wieder identisch mit dem Punkt vor dem nächsten Zeichen ist.

Betrachten Sie das Dokument im folgenden Beispiel. Es enthält ein roman-Element mit sieben Kindknoten, von denen drei Elementknoten sind und vier Textknoten, die nur Whitespace enthalten.

<?xml version="1.0"?>
<?xml-stylesheet type="text/css" value="roman.css"?>
<!-- Sie können dies aus dem letzten Kapitel übernehmen -->
<roman copyright="public domain">
   <titel>The Wonderful Wizard of Oz</titel>
   <autor>L. Frank Baum</autor>
   <jahr>1900</jahr>
</roman>

Code-Beispiel: Ein Roman-Dokument

Acht Punkte befinden sich direkt innerhalb des roman-Elements, diese sind von 0 bis 7 durchnummeriert und liegen jeweils unmittelbar nach und vor jedem Tag. Die folgende Abbildung zeigt diese Punkte.

Punkte innerhalb des roman-Elements

Abbildung: Die Punkte innerhalb des roman-Elements

Innerhalb des Textknotenkindes des Elements jahr gibt es fünf Punkte:

  • Punkt 0 zwischen <jahr> und 1
  • Punkt 1 zwischen 1 und 9
  • Punkt 2 zwischen 9 und 0
  • Punkt 3 zwischen 0 und 0
  • Punkt 4 zwischen 0 und </jahr>

Beachten Sie, dass die Punkte zwischen den Zeichen des Texts sitzen und nicht auf den Zeichen selbst. Punkte besitzen keine Dimension. Sie identifizieren eine Position, haben aber keine Ausdehnung, nicht einmal ein einzelnes Zeichen weit. Um ein oder mehrere Zeichen zu kennzeichnen, müssen Sie einen Bereich zwischen zwei Punkten festlegen.

XPointer fügt zwei Funktionen zu XPath hinzu, die es ganz leicht machen, den ersten und letzten Punkt innerhalb eines Knotens auszuwählen: start-point( ) und end-point( ). Dieser XPointer beispielsweise bezeichnet den ersten Punkt innerhalb des titel-Elements, d.h. den Punkt zwischen dem Titelknoten und seinem ersten Textknoten-Kind:

xpointer(start-point(//titel))

Dieser XPointer kennzeichnet den Punkt unmittelbar vor dem </autor>-Tag:

xpointer(end-point(//autor))

Gäbe es in diesem Dokument mehrere titel- und autor-Elemente, würde diese Funktion mehrere Punkte auswählen.

Dieser XPointer zeigt auf den Punkt unmittelbar vor dem Buchstaben T in »The Wonderful Wizard of Oz«:

xpointer(start-point(//titel/text()))

Dieser Punkt fällt auf die Position unmittelbar hinter dem Punkt, der durch xpointer(start-point(//titel)) bezeichnet wird. Es handelt sich bei diesen Punkten um zwei unterschiedliche Punkte, auch wenn sie im Text beide zwischen denselben Zeichen (> und T) liegen.

Um andere als den Anfangs- und Endpunkt eines Knotens anzusprechen, müssen Sie mittels string-range() erst einen Bereich bilden, der mit dem entscheidenden Punkt beginnt oder endet, dann können Sie mit start-point() oder end-point() auf ihn zugreifen. Das nehmen wir auf der nächsten Seite in Angriff.

  

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