edition W3C.de

XML Path Language (XPath)
Version 1.0

Deutsche, kommentierte �bersetzung

26. Februar 2002

Dies ist die deutsche �bersetzung der W3C-Empfehlung "XML Path Language (XPath)" vom 16. November 1999. Bitte beachten Sie, dass dieses Dokument �bersetzungsfehler enthalten kann. Die normative englische Version des Dokuments befindet sich unter http://www.w3.org/TR/1999/REC-xpath-19991116

Bitte schicken Sie Fehler in dieser �bersetzung oder Verbesserungsvorschl�ge an den �bersetzer.

Diese Version:
http://www.obqo.de/w3c-trans/xpath-de-20020226
http://www.edition-w3c.de/TR/1999/REC-xpath-19991116
(verf�gbar als XML oder HTML)
Aktuelle Version:
http://www.obqo.de/w3c-trans/xpath-de
http://www.edition-w3c.de/TR/xpath
Vorherige Version:
http://www.obqo.de/w3c-trans/xpath-de-20010910
�bersetzer:
Oliver Becker

Dieses Dokument ist urheberrechtlich gesch�tzt, Copyright � 1999–2002 W3C� (MIT, INRIA, Keio), alle Rechte vorbehalten. Die Rechte an dieser �bersetzung liegen beim �bersetzer, Copyright � 2002 Oliver Becker.

�
W3C

XML Path Language (XPath)
Version 1.0

Empfehlung des W3C, 16. November 1999

Diese Version:
http://www.w3.org/TR/1999/REC-xpath-19991116
(verf�gbar als XML oder HTML)
Aktuelle Version:
http://www.w3.org/TR/xpath
Vorherige Versionen:
http://www.w3.org/TR/1999/PR-xpath-19991008
http://www.w3.org/1999/08/WD-xpath-19990813
http://www.w3.org/1999/07/WD-xpath-19990709
http://www.w3.org/TR/1999/WD-xslt-19990421
Herausgeber:
James Clark
Steve DeRose (Inso Corp. and Brown University)

Zusammenfassung

Die Sprache XPath dient zur Adressierung von Teilen eines XML-Dokuments. Sie wurde f�r die Verwendung sowohl in XSLT als auch in XPointer entworfen.

Status dieses Dokuments

Dieses Dokument wurde von Mitgliedern des W3C und anderen Interessierten gepr�ft und vom Direktor als W3C-Empfehlung gebilligt. Es ist ein abgeschlossenes Dokument und darf als Referenzmaterial verwendet oder als normative Referenz von einem anderen Dokument zitiert werden. Die Rolle des W3C bei der Erstellung dieser Empfehlung ist es, die Spezifikation bekannt zu machen und ihre breite Anwendung zu f�rdern. Dies erh�ht die Funktionsf�higkeit und Interoperabilit�t des Web.

Die Liste der bekannten Fehler in dieser Spezifikation ist unter http://www.w3.org/1999/11/REC-xpath-19991116-errata verf�gbar.

Anmerkungen zu dieser Spezifikation k�nnen an [email protected] geschickt werden; alle Anmerkungen sind in einem Archiv verf�gbar.

Die englische Version dieser Spezifikation ist die einzig normative Version. Allerdings werden �bersetzungen dieses Dokuments unter http://www.w3.org/Style/XSL/translations.html aufgef�hrt.

Aktuelle W3C-Empfehlungen und weitere technische Dokumente sind unter http://www.w3.org/TR zu finden.

Diese Spezifikation ist das Ergebnis der gemeinsamen Arbeit der XSL- und der XML-Linking-Arbeitsgruppen und damit Teil der W3C Style Activity und der W3C XML Activity.

Inhaltsverzeichnis

1 Einleitung
2 Lokalisierungspfade
����2.1 Lokalisierungsschritte
����2.2 Achsen
����2.3 Knotentests
����2.4 Pr�dikate
����2.5 Abgek�rzte Syntax
3 Ausdr�cke
����3.1 Grundlagen
����3.2 Funktionsaufrufe
����3.3 Knotenmengen
����3.4 Boolesche Werte
����3.5 Zahlen
����3.6 Zeichenketten
����3.7 Lexikalische Struktur
4 Bibliothek der Grundfunktionen
����4.1 Funktionen auf Knotenmengen
����4.2 Zeichenkettenfunktionen
����4.3 Boolesche Funktionen
����4.4 Zahlenfunktionen
5 Datenmodell
����5.1 Wurzelknoten
����5.2 Elementknoten
��������5.2.1 Eindeutige IDs
����5.3 Attributknoten
����5.4 Namensraumknoten
����5.5 Processing-Instruction-Knoten
����5.6 Kommentarknoten
����5.7 Textknoten
6 Konformit�t

Anhang

A Referenzen
����A.1 Normative Referenzen
����A.2 Andere Referenzen
B Abbildung auf die XML-Informationsmenge (nicht normativ)

1 Einleitung

XPath ist das Ergebnis der Bem�hungen, eine gemeinsame Syntax und Semantik f�r jene Funktionen bereitzustellen, die sowohl von XSL Transformations [XSLT] als auch von XPointer [XPointer] genutzt werden. Die prim�re Aufgabe von XPath besteht in der Adressierung von Teilen eines XML-Dokuments [XML]. Zur Unterst�tzung dieser Aufgabe werden au�erdem einfache Hilfsmittel f�r die Manipulation von Zeichenketten, Zahlen und booleschen Werten bereitgestellt. XPath benutzt eine kompakte Nicht-XML-Syntax, um die Verwendung von XPath-Ausdr�cken innerhalb von URIs und XML-Attributen zu erleichtern. XPath operiert auf der abstrakten, logischen Struktur eines XML-Dokuments, nicht auf seiner �u�erlichen Syntax. Seinen Namen erh�lt XPath durch die Verwendung einer auch in URLs genutzten Pfad-Notation (path), mit der sich durch die hierarchische Struktur eines XML-Dokuments navigieren l�sst.

Neben der Verwendung f�r die Adressierung wurde XPath so gestaltet, dass eine nat�rliche Teilmenge davon zum Matching (Testen, ob ein Knoten auf ein Muster passt) genutzt werden kann. Diese Anwendung von XPath ist in XSLT beschrieben.

Anmerkung des �bersetzers:

Diese Teilmenge wird in XSLT Muster (pattern) genannt. Obwohl diese Muster durch eine eigene Grammatik definiert werden, ist jedes Muster auch ein XPath-Ausdruck.

Neben XSLT und XPointer existieren weitere Spezifikationen, die XPath nutzen. Als Beispiel sei hier der Arbeitsentwurf des W3C f�r die XML-Abfragesprache XQuery [XQuery] genannt, deren Syntax erweiterte XPath-Ausdr�cke verwendet.

XPath modelliert ein XML-Dokument als einen Baum, der aus Knoten besteht. Es gibt verschiedene Knotentypen, unter anderem Elementknoten, Attributknoten und Textknoten. XPath definiert, wie der Zeichenkettenwert f�r jeden Knotentyp berechnet wird. Einige Knoten besitzen zus�tzlich einen Namen. XPath unterst�tzt in vollem Umfang XML-Namensr�ume [XML Names]. Daher wird der Name eines Knotens als ein Paar aus einem lokalen Bestandteil und einem gegebenenfalls leeren Namensraum-URI modelliert – dieses wird erweiterter Name genannt. Das Datenmodell ist detailliert in [5 Datenmodell] beschrieben.

Anmerkung des �bersetzers:

Zur Veranschaulichung der durch XPath modellierten Baumstruktur soll folgendes Beispiel dienen:





   200g Mehl
   
   
      Zuerst nehmen Sie das
      Mehl
      und mischen es mit ...
   

Dieses recht kurze XML-Dokument besitzt bereits eine aus 23 Knoten bestehende Baumrepr�sentation:

Baumdarstellung

Die XML-Deklaration sowie die Dokumenttyp-Deklaration finden sich in der Baumdarstellung nicht wieder, auf sie kann �ber einen XPath-Ausdruck auch nicht zugegriffen werden. Alle anderen Bestandteile des Dokuments (Wurzel, Elemente, Textinhalt, Attribute, Namensr�ume, Kommentare, Processing Instructions) werden durch entsprechende Knoten des Baumes repr�sentiert. Die leeren Quadrate symbolisieren Textknoten, die ausschlie�lich Leerraumzeichen enthalten. Inwieweit sich solcher Leerraum in eigenen Textknoten wiederfindet, wird von der XPath nutzenden Anwendung bestimmt. Schlie�lich sei auf die implizit zu jedem Element geh�renden Namensraumknoten f�r den xml-Namensraum hingewiesen.

Das Document Object Model [DOM] definiert ebenfalls eine Baumrepr�sentation, die allerdings in einigen Punkten von der in XPath verwendeten abweicht. Auf diese Unterschiede wird innerhalb des Kapitels [5 Datenmodell] eingegangen.

Das prim�re syntaktische Konstrukt in XPath ist der Ausdruck. Ein Ausdruck l�sst sich aus der Produktion Expr ableiten. Die Auswertung eines Ausdrucks ergibt ein Objekt, das zu einem der folgenden vier Grundtypen geh�rt:

Anmerkung des �bersetzers:

Das sind die vier Grundtypen, die XPath definiert. Tats�chlich k�nnen darauf aufbauende Spezifikationen weitere Typen definieren, sodass die Auswertung eines XPath-Ausdrucks ein Objekt dieses neuen Typs ergeben kann. Insbesondere k�nnen im Ausdruck enthaltene Variablen Objekte anderer Typen aufnehmen.

Wie man sieht, gibt es keinen Datentyp f�r Knoten. Ein einzelner Knoten kann aber als Knotenmenge (node-set) dargestellt werden, die genau ein Element enth�lt.

Die innerhalb von Zeichenketten erlaubten UCS-Zeichen (Universal Multiple-Octet Coded Character Set) sind in [ISO/IEC 10646] bzw. [ISO/IEC 10646, 2nd Edition] beschrieben.

Ein Ausdruck wird immer bez�glich eines Kontextes ausgewertet. XSLT und XPointer spezifizieren, wie dieser Kontext bei der Verwendung von XPath-Ausdr�cken in XSLT bzw. XPointer bestimmt wird. Der Kontext besteht aus:

Die Kontextposition ist immer kleiner oder gleich der Kontextgr��e.

Die Variablenbelegungen bestehen aus einer Abbildung von Variablennamen auf Variablenwerte. Der Wert einer Variablen ist ein Objekt, welches von jedem beliebigen Typ sein kann, der f�r Ausdr�cke m�glich ist. Daneben sind auch weitere Typen m�glich, die hier nicht spezifiziert werden.

Anmerkung des �bersetzers:

In der XSLT-1.0-Spezifikation [XSLT] wird beispielsweise als neuer Typ Ergebnisteilbaum (result tree fragment) eingef�hrt. Werte dieses Typs entstehen im Ergebnis des Transformationsprozesses. Durch die folgende Variablenvereinbarung wird z.B. eine Variable namens antwort erzeugt, deren Wert ein Ergebnisteilbaum ist:


   

Dieser Typ wird voraussichtlich in zuk�nftigen XSLT-Versionen nicht mehr existieren, da das Ergebnis einer Transformation dann eine normale Knotenmenge vom Typ node-set sein wird, siehe [XSLT 2.0].

Die folgende Anweisung erzeugt dagegen eine Variable, deren Wert sich aus der Berechnung eines XPath-Ausdrucks expression ergibt:


An dieser Stelle sei darauf hingewiesen, dass die Erzeugung der Variablenbelegungen f�r antwort und var ein XSLT-Sprachmittel ist. XPath selbst stellt hierf�r keinerlei Konstrukte bereit. Neben xsl:variable besitzt XSLT f�r diesen Zweck xsl:param.

Die XPointer-Spezifikation [XPointer], die ebenfalls XPath nutzt, sieht keine M�glichkeiten f�r das Erzeugen von Variablenbelegungen vor. Die Verwendung von Variablenreferenzen innerhalb eines XPointer-Ausdrucks f�hrt daher zu einem syntaktischen Fehler. Die als Arbeitsentwurf des W3C vorgelegte Abfragesprache f�r XML-Dokumente XQuery [XQuery] benutzt zur Erzeugung von Variablenbelegungen so genannte FLWR-Ausdr�cke (gesprochen "flower", eine Abk�rzung f�r FOR-, LET-, WHERE- und RETURN-Klauseln).

Andere auf XPath aufbauende Spezifikationen m�ssen in analoger Weise definieren, wie Variablenbelegungen f�r einen Kontext erzeugt werden.

Die Funktionsbibliothek besteht aus einer Abbildung von Funktionsnamen auf Funktionen. Jede Funktion besitzt null oder mehr Argumente und liefert einen einzelnen Wert. Diese Spezifikation definiert eine Bibliothek von Grundfunktionen, die von allen XPath-Implementationen unterst�tzt werden muss (siehe [4 Bibliothek der Grundfunktionen]). Bei einer Grundfunktion geh�ren die Argumente und das Ergebnis einem der vier Grundtypen an. Sowohl XSLT als auch XPointer erweitern XPath um zus�tzliche Funktionen, von denen einige auf den vier Grundtypen, andere auf zus�tzlichen, durch XSLT und XPointer definierten Typen operieren.

Namensraumdeklarationen bestehen aus einer Abbildung von Pr�fixen auf Namensraum-URIs.

Anmerkung des �bersetzers:

Angenommen, ein Element enth�lt in seinem Start-Tag folgende Namensraumdeklaration: xmlns:xlink="http://www.w3.org/1999/xlink". Ein Kontext, f�r den diese Deklaration g�ltig ist, enth�lt dann eine Abbildung des Pr�fixes xlink auf den URI http://www.w3.org/1999/xlink.

Die Variablenbelegungen, die Funktionsbibliothek und die Namensraumdeklarationen, die benutzt werden, um einen Teilausdruck zu berechnen, sind immer dieselben, die auch f�r den umgebenden Ausdruck benutzt werden. Der Kontextknoten, die Kontextposition und die Kontextgr��e, die zur Berechnung eines Teilausdrucks benutzt werden, sind dagegen zuweilen verschieden von denen des umgebenden Ausdrucks. Mehrere Arten von Ausdr�cken �ndern den Kontextknoten, aber nur Pr�dikate �ndern die Kontextposition und die Kontextgr��e (siehe [2.4 Pr�dikate]). Bei der Beschreibung, wie bestimmte Ausdr�cke zu berechnen sind, wird immer explizit angegeben, ob sich der Kontextknoten, die Kontextposition oder die Kontextgr��e bei der Berechnung von Teilausdr�cken �ndert. Wird nichts �ber Kontextknoten, Kontextposition und Kontextgr��e ausgesagt, bleiben sie bei der Berechnung von Teilausdr�cken dieser Ausdr�cke gleich.

Anmerkung des �bersetzers:

Zur Erkl�rung hier ein kleiner Vorgriff:

Innerhalb eines Lokalisierungspfades �ndert jeder Schritt den Kontextknoten, der f�r die Berechnung der folgenden Schritte relevant ist. Durch ein Pr�dikat werden Knoten aus einer Knotenmenge herausgefiltert, sodass die Kontextgr��e sich in der Regel verkleinert und die Position der gefilterten Knoten sich entsprechend �ndert.

XPath-Ausdr�cke erscheinen h�ufig in XML-Attributen. Die in diesem Abschnitt spezifizierte Grammatik wird auf Attributwerte nach ihrer Normalisierung gem�� XML 1.0 angewendet. Wenn beispielsweise die Grammatik das Zeichen < verwendet, darf dieses nicht in der XML-Quelle als < auftreten, sondern muss gem�� den XML-1.0-Regeln notiert werden, zum Beispiel durch Eingabe als <. Innerhalb von Ausdr�cken werden Zeichenkettenliterale durch einfache oder doppelte Anf�hrungszeichen begrenzt, die ebenfalls zur Begrenzung von XML-Attributen verwendet werden. Um zu vermeiden, dass ein Anf�hrungszeichen innerhalb eines Ausdrucks durch den XML-Prozessor als Abschluss des Attributwertes interpretiert wird, kann das Anf�hrungszeichen als Zeichenreferenz eingegeben werden (" oder '). Alternativ k�nnen im Ausdruck einfache Anf�hrungszeichen benutzt werden, falls das XML-Attribut durch doppelte Anf�hrungszeichen begrenzt wird oder umgekehrt.

Anmerkung des �bersetzers:

Statt "Zeichenreferenz" muss es hier "Entity-Referenz" hei�en.

Abgesehen davon gibt es immer noch F�lle, in denen dieses einfache Kochrezept nicht ausreichend ist – n�mlich dann, wenn eine Zeichenkette ben�tigt wird, die beide Arten von Anf�hrungszeichen enthalten soll.

Angenommen, es soll getestet werden, ob der Inhalt des Elements para mit der Zeichenkette �Sie fragte: "Wie geht's?"� �bereinstimmt. M�chte man diese Zeichenkette innerhalb eines XPath-Ausdrucks durch doppelte Anf�hrungszeichen begrenzen, k�nnte man auf die Idee kommen, beispielsweise durch Verwendung der Entity-Referenz " Folgendes zu schreiben:

para="Sie fragte: "Wie geht's?""

Das ist aber keine L�sung, da ein XML-Parser, der diese Zeichenfolge analysiert, Entity-Referenzen aufl�st. Ein darauf aufsetzender XPath-Prozessor kann nicht mehr zwischen �"� und �"� unterscheiden. Formuliert man im n�chsten Schritt dann n�mlich weiter

(diese Zeile ist im XML-Sinn wohlgeformt), so f�hrt das zu einem Fehler im XPath-Prozessor, da dieser trotzdem die folgende Zeichenkette auswertet:

para="Sie fragte: "Wie geht's?""

Eine einfache L�sung f�r solche F�lle besteht darin, die betreffende Zeichenkette als Wert einer Variablen zu definieren, etwa in XSLT per

Sie fragte: "Wie geht's?"

und anschlie�end diese Variable in XPath-Ausdr�cken zu verwenden.

Alternativ kann man die gew�nschte Zeichenkette aus mehreren Teilen zusammensetzen (unter Benutzung der noch zu erl�uternden Funktion concat), wobei jede Teilzeichenkette jeweils nur eine Sorte von Anf�hrungszeichen enth�lt:

para=concat('Sie fragte: "Wie geht', "'", 's?"')

Das Anf�hrungszeichen, das zur Begrenzung dieses Ausdrucks innerhalb eines Attributwertes genutzt wird, muss dann durch die dazugeh�rige Entity-Referenz ersetzt werden. Das Ergebnis sieht zwar un�bersichtlich aus, ist aber syntaktisch korrekt:


Diese zweite Variante muss verwendet werden, wenn Variablen nicht erlaubt sind, etwa innerhalb eines XSLT-Musters oder als Bestandteil eines XPointers.

Ein wichtiger spezieller Ausdruck ist der Lokalisierungspfad. Ein Lokalisierungspfad w�hlt eine Knotenmenge relativ zu einem Kontextknoten aus. Das Ergebnis der Berechnung eines Ausdrucks, der ein Lokalisierungspfad ist, ist genau die Knotenmenge, die die durch den Lokalisierungspfad ausgew�hlten Knoten enth�lt. Lokalisierungspfade k�nnen Ausdr�cke rekursiv enthalten, die zum Filtern von Knotenmengen benutzt werden. Ein Lokalisierungspfad l�sst sich aus der Produktion LocationPath ableiten.

Die in der nachfolgenden Grammatik verwendeten Nichtterminale QName und NCName sind in [XML Names] definiert, S ist in [XML] definiert. Die Grammatik verwendet die gleiche EBNF-Notation wie in [XML] (mit der Ausnahme, dass Grammatiksymbole immer mit einem Gro�buchstaben beginnen).

Anmerkung des �bersetzers:

Die Erweiterte Backus-Naur-Form (EBNF) wird zur Notation von formalen Grammatiken verwendet. Sie wird im Kapitel Notation der XML-Spezifikation [XML, 2nd Edition] n�her erl�utert.

Ausdr�cke werden geparst, indem die Zeichenfolge in einzelne Tokens zerlegt und anschlie�end die entstehende Folge der Tokens geparst wird. Leerraumzeichen k�nnen beliebig zwischen Tokens verwendet werden. Der Zerlegungsprozess wird in [3.7 Lexikalische Struktur] beschrieben.

Anmerkung des �bersetzers:

Ein Token ist eine syntaktische Einheit von Zeichen, etwa der Name �html�, die Zahl �3.14159� oder der Operator �!=�. Die zwischen diesen Tokens erlaubten Leerraumzeichen sind gem�� der XML-Spezifikation Folgen aus Leerzeichen (#x20), Tabulatoren (#x9), Zeilenvorsch�ben (#xA) und Wagenr�ckl�ufen (#xD). Innerhalb eines Tokens d�rfen keine solchen Leerraumzeichen auftreten, so z.B. nicht zwischen den beiden einzelnen Zeichen �!� und �=� des Operators �!=�.

2 Lokalisierungspfade

Obwohl Lokalisierungspfade nicht das allgemeinste grammatische Konstrukt der Sprache darstellen (ein Lokalisierungspfad ist ein Spezialfall eines Ausdrucks), sind sie doch das wichtigste Konstrukt und werden deshalb als Erstes beschrieben.

Jeder Lokalisierungspfad kann durch eine unkomplizierte und eher verbale Syntax ausgedr�ckt werden. Daneben gibt es eine Reihe von syntaktischen Abk�rzungen, mit denen sich h�ufige F�lle kurz und pr�gnant ausdr�cken lassen. Dieser Abschnitt erl�utert die Semantik von Lokalisierungspfaden anhand der ausf�hrlichen Syntax. Die abgek�rzte Syntax wird im Anschluss daran erl�utert, indem gezeigt wird, wie diese auf die ausf�hrliche Syntax abgebildet wird (siehe [2.5 Abgek�rzte Syntax]).

Es folgen einige Beispiele f�r Lokalisierungspfade unter Benutzung der ausf�hrlichen Syntax:

Es gibt zwei Arten von Lokalisierungspfaden: relative und absolute Lokalisierungspfade.

Ein relativer Lokalisierungspfad wird durch eine Folge aus einem oder mehreren Lokalisierungsschritten gebildet, die durch / voneinander getrennt sind. Die Schritte eines relativen Lokalisierungspfades werden von links nach rechts zusammengesetzt. Jeder Schritt w�hlt der Reihe nach eine Knotenmenge relativ zu einem Kontextknoten aus. Eine Anfangsfolge von Schritten wird mit einem folgenden Schritt wie folgt zusammengesetzt: Die Anfangsfolge von Schritten w�hlt eine Knotenmenge relativ zu einem Kontextknoten aus. Jeder Knoten in dieser Menge wird dann als Kontextknoten f�r den folgenden Schritt benutzt. Die durch diesen Schritt bestimmten Knotenmengen werden vereinigt. Die Vereinigung ist dann genau die Knotenmenge, die durch das Zusammensetzen der Schritte ausgew�hlt wird. Zum Beispiel w�hlt child::div/child::para die para-Kindelemente der div-Kindelemente des Kontextknotens aus, oder – mit anderen Worten – die para-Enkelelemente, die div-Elternelemente haben.

Ein absoluter Lokalisierungspfad besteht aus dem Zeichen / und einem optional folgenden relativen Lokalisierungspfad. Ein / allein w�hlt den Wurzelknoten des Dokuments aus, das den Kontextknoten enth�lt. Falls ein relativer Lokalisierungspfad folgt, so w�hlt der Lokalisierungspfad die Knotenmenge aus, die ein relativer Lokalisierungspfad relativ zum Wurzelknoten des den Kontextknoten enthaltenen Dokuments ausw�hlen w�rde.

Anmerkung des �bersetzers:

Hier bietet sich der Vergleich zu Pfaden im Dateisystem an: Sowohl in UNIX-Betriebssystemen als auch innerhalb von URLs wird der Schr�gstrich �/� als Trennzeichen innerhalb von Dateipfaden benutzt. In �hnlicher Weise kann man sich Pfade in einem XML-Baum vorstellen. Ein relativer Pfad geht immer vom aktuellen Knoten (dem Kontextknoten) aus, ein absoluter Pfad beginnt immer an der Dokumentwurzel. Genau genommen ist ein absoluter Pfad allerdings ebenfalls relativ, n�mlich zum Dokument des Kontextknotens. Das spielt eine Rolle, wenn Knoten aus mehreren Dokumenten verarbeitet werden.

Man sollte sich allerdings einer Feinheit bewusst sein: W�hrend beispielsweise durch �verzeichnis1/verzeichnis2/datei3� in einem Dateisystem exakt eine Datei adressiert wird, eben jene, die den Namen �datei3� tr�gt und sich in dem Unterverzeichnis �verzeichnis1/verzeichnis2� befindet, w�hlt ein analoger XPath immer eine Knotenmenge aus, die in der Regel mehrere Knoten enthalten kann. Das sollte aber nicht weiter verwundern, darf ein Element doch durchaus mehrere gleichnamige Kindelemente besitzen.

Lokalisierungspfade
[1]��� LocationPath ���::=��� RelativeLocationPath
| AbsoluteLocationPath
[2]��� AbsoluteLocationPath ���::=��� '/' RelativeLocationPath?
| AbbreviatedAbsoluteLocationPath
[3]��� RelativeLocationPath ���::=��� Step
| RelativeLocationPath '/' Step
| AbbreviatedRelativeLocationPath

Anmerkung des �bersetzers:

Die obige Grammatik gibt das bisher Beschriebene noch einmal formal wieder. Wie man sieht, k�nnen Lokalisierungspfade auch abgek�rzte Bestandteile enthalten. Diese werden in Kapitel [2.5 Abgek�rzte Syntax] beschrieben.

2.1 Lokalisierungsschritte

Ein Lokalisierungsschritt hat drei Bestandteile:

Ein Lokalisierungsschritt besteht syntaktisch aus dem Namen der Achse, gefolgt von zwei Doppelpunkten und dem Knotentest, gefolgt von null oder mehr in eckigen Klammern eingeschlossenen Ausdr�cken. Zum Beispiel enth�lt child::para[position()=1] die Achse child, den Knotentest para und ein Pr�dikat [position()=1].

Die durch den Lokalisierungspfad ausgew�hlte Knotenmenge ergibt sich aus der durch Achse und Knotentest bestimmten Ausgangsknotenmenge, indem dort der Reihe nach die einzelnen Pr�dikate angewendet werden.

Die Ausgangsknotenmenge enth�lt alle Knoten, die zum Kontextknoten in der durch die Achse angegebenen Beziehung stehen und die den im Knotentest spezifizierten Knotentyp und erweiterten Namen besitzen. Zum Beispiel w�hlt der Lokalisierungsschritt descendant::para alle para-Nachkommen des Kontextknotens aus: descendant besagt, dass jeder Knoten in der Ausgangsknotenmenge ein Nachkomme des Kontextknotens sein muss; para besagt, dass jeder Knoten in der Ausgangsknotenmenge ein Element mit dem Namen para sein muss. Die verf�gbaren Achsen werden in [2.2 Achsen] beschrieben, die verf�gbaren Knotentests in [2.3 Knotentests]. Die Bedeutung einiger Knotentests h�ngt von der jeweiligen Achse ab.

Die Ausgangsknotenmenge wird durch das erste Pr�dikat gefiltert und ergibt eine neue Knotenmenge. Diese wird anschlie�end durch das zweite Pr�dikat gefiltert und so weiter. Die resultierende Knotenmenge ist schlie�lich die Knotenmenge, die durch den Lokalisierungsschritt ausgew�hlt wird. Die Achse beeinflusst, wie der Ausdruck in jedem Pr�dikat berechnet wird. Die Semantik eines Pr�dikats ist damit bez�glich einer Achse definiert (siehe [2.4 Pr�dikate]).

Anmerkung des �bersetzers:

Dieser letzte Satz bezieht sich auf Pr�dikate, die die Kontextposition und damit die N�heposition der gefilterten Knoten auswerten.

Zur Verdeutlichung der Vorgehensweise bei mehreren Pr�dikaten sei auf die beiden bereits diskutierten Beispiele

child::para[attribute::type="warning"][position()=5]

und

child::para[position()=5][attribute::type="warning"]

in Kapitel [2 Lokalisierungspfade] verwiesen.

Lokalisierungsschritte
[4]��� Step ���::=��� AxisSpecifier NodeTest Predicate*
| AbbreviatedStep
[5]��� AxisSpecifier ���::=��� AxisName '::'
| AbbreviatedAxisSpecifier

2.2 Achsen

Es stehen die folgenden Achsen zur Verf�gung:

Anmerkung: Die Achsen ancestor, descendant, following, preceding und self partitionieren ein Dokument (unter Auslassung der Attribut- und Namensraumknoten): sie �berschneiden sich nicht und enthalten zusammen alle Knoten des Dokuments.

Anmerkung des �bersetzers:

Achsen-Aufteilung eines Dokuments
Achsen
[6]��� AxisName ���::=��� 'ancestor'
| 'ancestor-or-self'
| 'attribute'
| 'child'
| 'descendant'
| 'descendant-or-self'
| 'following'
| 'following-sibling'
| 'namespace'
| 'parent'
| 'preceding'
| 'preceding-sibling'
| 'self'

Anmerkung des �bersetzers:

Attribut- und Namensraumachse nehmen hier eine Sonderrolle ein. Die adressierten Knoten zeichnen sich n�mlich durch einen bestimmten festen Knotentyp aus (den so genannten Hauptknotentyp). Da diese Knoten per Definition keine Kinder anderer Knoten sind, wurden die speziellen Achsen attribute und namespace definiert. Trotzdem kann sich auch an diese Achsen ein beliebiger Knotentest anschlie�en (siehe [2.3 Knotentests]). Dies birgt die Gefahr, dass zwar syntaktisch korrekte, aber sinnlose Lokalisierungsschritte benutzt werden k�nnen, die niemals einen Knoten ausw�hlen. Der Lokalisierungsschritt attribute::text(), der �ber die Attributachse einen Textknoten ausw�hlen soll, liefert beispielsweise immer eine leere Knotenmenge.

2.3 Knotentests

Jede Achse besitzt einen Hauptknotentyp. Falls eine Achse Elemente enthalten kann, so ist der Hauptknotentyp der Elementtyp, ansonsten ist es genau der Typ der Knoten, die die Achse enthalten kann. Das bedeutet:

Ein Knotentest, der ein QName ist, ist genau dann erf�llt, wenn der Knotentyp (siehe [5 Datenmodell]) der Hauptknotentyp ist und einen erweiterten Namen besitzt, der gleich dem erweiterten Namen des QName ist. Beispielsweise w�hlt child::para die para-Kindelemente des Kontextknotens aus. Falls der Kontextknoten keine para-Kinder besitzt, ist das Ergebnis eine leere Knotenmenge. attribute::href w�hlt die href-Attribute des Kontextknotens aus. Falls der Kontextknoten keine href-Attribute besitzt, ist das Ergebnis eine leere Knotenmenge.

Anmerkung des �bersetzers:

Das Akronym QName steht f�r "qualifizierter Name" und bedeutet, dass der entsprechende Name aus einem optionalen Pr�fix und einem lokalen Bestandteil bestehen kann. Beide Teile werden durch einen Doppelpunkt voneinander getrennt. Durch das Pr�fix wird der Namensraum bestimmt, zu dem der lokale Name geh�rt. Im Beispiel xlink:href ist xlink das Pr�fix und href der lokale Bestandteil. Die obigen Beispiele verwenden Knotentests, die letztendlich nur lokale Namen sind, also keine Namensr�ume ber�cksichtigen.

M�chte man auf das href-Attribut aus dem xlink-Namensraum zugreifen, w�re also zu schreiben: attribute::xlink:href. Entsprechend greift man per preceding-sibling::xhtml:h1 auf die dem Kontextknoten vorhergehenden h1-Elemente aus dem xhtml-Namensraum zu. Schlie�lich ein Beispiel f�r die Namensraumachse: namespace::xlink w�hlt genau den Namensraumknoten aus, der zum Pr�fix xlink geh�rt. Der qualifizierte Name eines Namensraumknotens enth�lt �brigens niemals ein Pr�fix, siehe [5.4 Namensraumknoten].

Wie in den Beispielen am Beginn des Kapitels bereits gezeigt wurde, eignet sich die Achse self, um innerhalb eines Pr�dikats bestimmte Elementtypen aus einer Knotenmenge herauszufiltern, wie z.B. in child::*[self::chapter or self::appendix]. Leider funktioniert eine analoge Vorgehensweise f�r Attribut- oder Namensraumknoten nicht. Das erweist sich insbesondere bei negativen Bedingungen als hinderlich. M�chte man z.B. alle Attribute bis auf das href-Attribut ausw�hlen, leistet attribute::*[not(self::href)] leider nicht das Gew�nschte. Dieser Ausdruck liefert n�mlich nach wie vor alle Attribute. Da die self-Achse Elemente enthalten kann, ihr Hauptknotentyp somit der Elementtyp ist, sucht der Ausdruck self::href immer nach einem Element mit dem Namen href, niemals nach einem Attribut. Eine L�sung f�r dieses Problem besteht in der Auswertung des Attributnamens, siehe die Funktionen name und local-name.

Ein QName im Knotentest wird in einen erweiterten Namen unter Verwendung der Namensraumdeklarationen aus dem Kontext des Ausdrucks expandiert. Dies geschieht in der gleichen Weise wie bei Elementnamen in Start- und End-Tags, allerdings mit der Ausnahme, dass ein mit xmlns deklarierter voreingestellter Namensraum nicht genutzt wird: d.h. enth�lt QName kein Pr�fix, so ist der Namensraum-URI leer (das ist die gleiche Regel, nach der auch Attributnamen expandiert werden). Es ist ein Fehler, wenn der QName ein Pr�fix enth�lt, f�r das es keine Namensraumdeklaration im Kontext des Ausdrucks gibt.

Anmerkung des �bersetzers:

Qualifizierte Namen werden also gem�� der Namensraum-Empfehlung [XML Names] expandiert. Das bedeutet insbesondere, dass in einem XPath-Ausdruck nicht das gleiche Pr�fix wie im betrachteten XML-Dokument benutzt werden muss. Wichtig ist nur, dass beide Pr�fixe den gleichen Namensraum repr�sentieren. Wenn beispielsweise das zugrunde liegende XML-Dokument ein XHTML-Dokument ist, dessen Elemente zum Namensraum http://www.w3.org/1999/xhtml geh�ren, so kann beispielsweise das Dokumentelement �ber den XPath-Ausdruck /child::xhtml:html ausgew�hlt werden – vorausgesetzt, das Pr�fix xhtml wurde im Kontext des Ausdrucks an den gleichen Namensraum gebunden. Dabei ist es v�llig unerheblich, welches Pr�fix im XHTML-Dokument benutzt wurde – es ist sogar m�glich, dass dort nur eine Deklaration f�r den voreingestellten Namensraum vorkommt: .

Gerade in diesen F�llen ist Vorsicht geboten. Sehr leicht �bersieht man eine solche Namensraumdeklaration, die sich selbstverst�ndlich auch auf alle Kindelemente auswirkt, und ist gewillt, nur den jeweiligen Elementnamen in einem Ausdruck anzugeben, z.B. bei folgender XSLT-Anweisung: . Richtig w�re stattdessen (der Vollst�ndigkeit halber mit Namensraumdeklaration): . Entsprechend m�ssen in Lokalisierungpfaden alle Schritte vollst�ndig qualifiziert sein: xhtml:div/xhtml:p.

Stellt man fest, dass XPath-Ausdr�cke nach dem Einf�gen einer DTD in das Originaldokument nicht mehr die richtigen Knoten zur�ckliefern (was sich beispielsweise darin �u�ert, dass ein XSLT-Stylesheet nicht mehr die erwartete Ausgabe liefert), ist in der Regel ebenfalls die Deklaration eines voreingestellten Namensraums die Ursache. Eine Deklaration innerhalb der DTD der Form versetzt alle Kindelemente von html ohne Pr�fix und auch html selbst in den XHTML-Namensraum. Ohne die DTD geh�ren sie keinem Namensraum an. In solchen F�llen sollte man die Deklaration des voreingestellten Namensraums in das XML-Dokument aufnehmen, damit XPath-Ausdr�cke unabh�ngig von der Auswertung einer DTD immer das gleiche Ergebnis liefern.

Schlie�lich sei noch einmal darauf hingewiesen, dass sich ein voreingestellter Namensraum im Kontext eines XPath-Ausdrucks nicht auf den Ausdruck auswirkt. Ein qualifizierter Name ohne Pr�fix adressiert damit immer ein Element oder ein Attribut, das zu keinem Namensraum geh�rt. Die folgende Variante ist damit keine Alternative zum obigen Beispiel: .

Ein Knotentest * ist f�r jeden Knoten des Hauptknotentyps erf�llt. Beispielsweise w�hlt child::* alle Kindelemente und attribute::* alle Attributknoten des Kontextknotens aus.

Anmerkung des �bersetzers:

Handelt es sich beim Kontextknoten um einen Elementknoten, so liefert der Schritt parent::* nur dann die leere Knotenmenge, wenn dieser das Dokumentelement repr�sentiert. Der Elementknoten f�r das Dokumentelement besitzt zwar ebenfalls einen Elternknoten, n�mlich die Wurzel /, diese ist aber nicht vom Hauptknotentyp der Achse parent, dem Elementtyp.

Ein Knotentest kann in der Form NCName:* auftreten. In diesem Fall wird das Pr�fix wie bei einem QName unter Verwendung der Namensraumdeklarationen des Kontextes expandiert. Es ist ein Fehler, wenn es f�r das Pr�fix keine Namensraumdeklaration im Kontext des Ausdrucks gibt. Der Knotentest ist erf�llt f�r jeden Knoten des Hauptknotentyps, dessen erweiterter Name den Namensraum-URI besitzt, zu dem das Pr�fix expandiert, unabh�ngig vom lokalen Bestandteil des Namens.

Anmerkung des �bersetzers:

Beispielsweise w�hlt descendant::xhtml:* alle Nachkommen aus dem xhtml-Namensraum und attribute::xlink:* alle Attribute aus dem xlink-Namensraum aus.

Diese Form von Knotentests kann in einem XSLT-Stylesheet innerhalb eines Musters z.B. dazu genutzt werden, alle Elemente eines bestimmten Namensraums in der gleichen Weise zu behandeln. Eingebettete XHTML-Elemente in einem beliebigen zu transformierenden XML-Dokument k�nnen auf diese Weise einfach in die Ausgabe kopiert werden, ohne dass diese Elemente explizit benannt werden m�ssen.

Der Knotentest text() ist erf�llt f�r jeden Textknoten. Zum Beispiel w�hlt child::text() alle Textknoten aus, die Kinder des Kontextknotens sind. Analog ist der Knotentest comment() f�r jeden Kommentarknoten erf�llt und der Knotentest processing-instruction() f�r jede Processing Instruction. Dem Test processing-instruction() kann ein Literal als Argument �bergeben werden. In diesem Fall ist der Test f�r jede Processing Instruction erf�llt, deren Name gleich dem Wert des �bergebenen Literals ist.

Anmerkung des �bersetzers:

Offensichtlich werden Kommentare nicht einfach ignoriert, sondern durch eigene Knoten innerhalb des XML-Baumes repr�sentiert. Auf diese Weise k�nnen XPath-Ausdr�cke mittels comment() auch auf Kommentarknoten zugreifen. Ein Stylesheet kann damit XML-Kommentare verarbeiten und diese geeignet darstellen.

F�r Processing Instructions gibt es ebenfalls entsprechende Knoten im XML-Baum. Jede Processing Instruction besitzt einen Namen (ein Ziel), z.B. xml-stylesheet in . Wird dieser Name im Knotentest processing-instruction() angegeben, ist der entsprechende Test nur f�r Processing Instructions mit gleichem Namen erf�llt. Namen von Processing Instructions werden dabei nicht von Namensraumdeklarationen beeinflusst. Das Argument f�r processing-instruction() ist damit kein qualifizierter Name, sondern ein Zeichenkettenliteral. Der Knotentest f�r die zitierte Processing Instruction lautet z.B. processing-instruction('xml-stylesheet').

Der Knotentest node() ist f�r alle Knoten jedes beliebigen Typs erf�llt.

Anmerkung des �bersetzers:

M�chte man alle Knoten eines Dokuments ausw�hlen, kann man z.B. die folgenden Knotenmengen vereinigen: /descendant-or-self::node(), /descendant-or-self::node()/attribute::* und /descendant-or-self::node()/namespace::*.

Es wurde bereits auf die Sonderrolle von Attribut- und Namensraumknoten hingewiesen. Diese werden nicht durch einen Knotentest, sondern durch entsprechende Achsen ausgew�hlt. Das hat zur Folge, dass sich zwar einfach pr�fen l�sst, ob der Kontextknoten z.B. ein Textknoten ist (per self::text(); analog f�r Element-, Kommentar- und Processing-Instruction-Knoten), allerdings funktioniert diese Methode nicht bei Attribut- und Namensraumknoten. Hier muss man stattdessen �berpr�fen, ob sich der Kontextknoten in der Menge der Attribut- bzw. Namensraumknoten des Elternknotens befindet, siehe [3.3 Knotenmengen].

[7]��� NodeTest ���::=��� NameTest
| NodeType '(' ')'
| 'processing-instruction' '(' Literal ')'

2.4 Pr�dikate

Eine Achse ist entweder vorw�rts- oder r�ckw�rtsgerichtet. Eine vorw�rtsgerichtete Achse enth�lt immer nur den Kontextknoten oder Knoten, die nach dem Kontextknoten im Dokument auftreten. Eine r�ckw�rtsgerichtete Achse enth�lt immer nur den Kontextknoten oder Knoten, die vor dem Kontextknoten im Dokument auftreten. Demzufolge sind die Achsen ancestor, ancestor-or-self, preceding und preceding-sibling r�ckw�rtsgerichtete Achsen. Alle anderen Achsen sind vorw�rtsgerichtet. Da die Achse self immer h�chstens einen Knoten enth�lt, hat es keine Bedeutung, ob sie als vorw�rts- oder r�ckw�rtsgerichtete Achse betrachtet wird. Die N�heposition eines Knotens in einer Knotenmenge bez�glich einer Achse ist definiert als die Position des Knotens in dieser Knotenmenge, welche in Dokumentordnung geordnet ist, wenn es sich um eine vorw�rtsgerichtete Achse handelt, und welche in umgekehrter Dokumentordnung geordnet ist, wenn es sich um eine r�ckw�rtsgerichtete Achse handelt. Die erste Position ist 1.

Anmerkung des �bersetzers:

Diese recht komplizierte Definition bedarf einer Erl�uterung. Die Knoten in einer Knotenmenge sind ungeordnet – es handelt sich schlie�lich um eine Menge. Allerdings kann �ber die Funktion position die Position eines Knotens in der aktuellen Knotenliste bestimmt werden. Die Reihenfolge der Knoten orientiert sich an der Reihenfolge, in der die Knoten im XML-Dokument auftreten. Bei vorw�rtsgerichteten Achsen wird diese Ursprungsreihenfolge beibehalten und man spricht von Dokumentordnung. F�r r�ckw�rtsgerichtete Achsen wird die Reihenfolge umgekehrt und man spricht von umgekehrter Dokumentordnung.

Die obige Definition hat zur Folge, dass innerhalb eines Lokalisierungsschrittes immer der n�chstgelegene Knoten die Position 1 hat. Abh�ngig von der Blickrichtung kann es sich um einen unmittelbaren Vorg�nger (preceding) bzw. Vorfahren (ancestor) oder aber um einen unmittelbaren Nachfolger (following) bzw. Nachkommen (descendant) handeln. Der Begriff N�heposition beschreibt damit die N�he zum Kontextknoten. Die Abbildungen zu den verschiedenen Achsen in Kapitel [2.2 Achsen] verdeutlichen die N�heposition der jeweiligen zur Achse geh�renden Knoten. Genau genommen ist die parent-Achse ebenfalls r�ckw�rtsgerichtet, allerdings enth�lt diese wie self maximal einen Knoten.

Die N�heposition ist nur innerhalb von Pr�dikaten in Lokalisierungsschritten von Bedeutung, da hier die ausschlaggebende Achse bekannt ist. Die in [4.2 Zeichenkettenfunktionen] vorgestellte Funktion string (ebenso wie die Funktionen number und boolean) konvertiert dagegen bei einer Knotenmenge immer den ersten Knoten bez�glich der Dokumentordnung, unabh�ngig davon, auf welchem Weg diese Knotenmenge gebildet wurde.

F�r vorw�rtsgerichtete Achsen gilt daher folgende Gleichheit (am Beispiel following):

string(following::p) = string(following::p[position()=1])

Dies ist bei r�ckw�rtsgerichteten Achsen nicht der Fall. Stattdessen gilt hier (am Beispiel preceding):

string(preceding::p) = string(preceding::p[position()=last()])

Die XSLT-Anweisung xsl:value-of verwendet implizit die Funktion string, um einen Textknoten zu generieren. Will man also auf den Wert des ersten Knotens einer r�ckw�rtsgerichteten Achse zugreifen, muss man diesen immer explizit durch ein Pr�dikat ausw�hlen. Die Ausgabe des Wertes eines Attributs id des Vorg�ngerknotens erfolgt daher z.B. durch .

F�r Attribute und Namensraumknoten ist die Diskussion um Position und Richtung bedeutungslos. Das liegt daran, dass die Reihenfolge, in der Attribute und Namensraumdeklarationen im Start-Tag eines Elements angegeben wurden, als irrelevant angesehen wird. Informationen dar�ber sind daher nicht mehr im XML-Baum enthalten.

Ein Pr�dikat filtert eine Knotenmenge bez�glich einer Achse und produziert damit eine neue Knotenmenge. F�r jeden zu filternden Knoten der Knotenmenge wird der dazugeh�rige Ausdruck PredicateExpr berechnet, und zwar mit diesem Knoten als Kontextknoten, der Anzahl der Knoten der Knotenmenge als Kontextgr��e und mit der N�heposition des Knotens in der Knotenmenge bez�glich der Achse als Kontextposition. Falls die Berechnung von PredicateExpr f�r diesen Knoten wahr ergibt, wird der Knoten in die Ergebnisknotenmenge aufgenommen, andernfalls nicht.

Anmerkung des �bersetzers:

Diese Definition soll anhand eines Beispiels veranschaulicht werden:

ancestor::person[position() >= 2]

Achse und Knotentest ancestor::person liefern die Menge aller person-Elemente, die Vorfahren des Kontextknotens sind. F�r jeden dieser Elementknoten wird nun der Ausdruck position() >= 2 berechnet. Die Kontextgr��e ist dabei die Anzahl aller person-Vorfahren. Da ancestor eine r�ckw�rtsgerichtete Achse ist, werden die Knoten entgegen der Originalreihenfolge nummeriert. Damit werden alle person-Elementknoten bis auf den ersten (d.h. den n�chsten) in die Ergebnisknotenmenge aufgenommen. Da als Knotentest des Lokalisierungsschrittes person verwendet wurde (und nicht *), muss es sich bei diesem ersten person-Elementknoten nicht um den Elternknoten handeln. W�rde sich ein weiteres Pr�dikat an den obigen Ausdruck anschlie�en, w�re die gerade berechnete Ergebnisknotenmenge Ausgangspunkt f�r dieses Pr�dikat.

Falls der Ausdruck eines nachfolgenden Pr�dikats nicht auf Kontextgr��e oder -position zugreift, kann dieser Ausdruck bereits im ersten Pr�dikat berechnet und �ber den logischen Operator and mit dem dortigen Ausdruck verbunden werden. Der Lokalisierungsschritt

child::chapter[child::title][attribute::type="warning"]

liefert damit die gleiche Knotenmenge wie

child::chapter[child::title and attribute::type="warning"]

Ein PredicateExpr wird durch Berechnung des Expr und anschlie�ender Konvertierung des Ergebnisses in einen booleschen Wert bestimmt. Falls das Ergebnis eine Zahl war, wird es f�r den Fall, dass diese Zahl gleich der Kontextposition ist, in den Wert wahr konvertiert, ansonsten in den Wert falsch. Wenn das Ergebnis keine Zahl war, dann wird es so konvertiert wie bei einem Aufruf der Funktion boolean. Damit ist ein Lokalisierungspfad para[3] �quivalent zu para[position()=3].

Anmerkung des �bersetzers:

Da die abgek�rzte Syntax erst im folgenden Kapitel beschrieben wird, sollte als Beispiel hier besser child::para[3] verwendet werden.

F�r Zahlen als Wert eines PredicateExpr gilt hier eine Sonderregel. Diese erm�glicht eine Schreibweise, die dem Zugriff auf Feldelemente in anderen Programmiersprachen gleicht. Allerdings muss beachtet werden, dass ein Ausdruck child::para[$num] nur dann gleichbedeutend mit child::para[position()=$num] ist, wenn die Variable num tats�chlich eine Zahl, also ein Objekt vom Typ number enth�lt. Wenn sie stattdessen nur eine geeignete Zeichenkette enth�lt, wird der Variableninhalt gem�� der Funktion boolean in einen booleschen Wert konvertiert. Das Gleiche gilt f�r jedes andere Objekt, das sich in eine Zahl konvertieren lie�e.

Pr�dikate
[8]��� Predicate ���::=��� '[' PredicateExpr ']'
[9]��� PredicateExpr ���::=��� Expr

2.5 Abgek�rzte Syntax

Zun�chst einige Beispiele f�r Lokalisierungspfade, die die abgek�rzte Syntax benutzen:

Die wichtigste Abk�rzung besteht darin, dass child:: in einem Lokalisierungsschritt weggelassen werden kann. Die Standardachse ist also child. So steht beispielsweise ein Lokalisierungspfad div/para abk�rzend f�r child::div/child::para.

F�r Attribute gibt es ebenfalls eine Abk�rzung: attribute:: kann zu @ abgek�rzt werden. Ein Lokalisierungspfad para[@type="warning"] steht beispielsweise abk�rzend f�r child::para[attribute::type="warning"] und w�hlt damit para-Kindelemente mit einem Attribut type aus, dessen Wert gleich warning ist.

// ist die Abk�rzung f�r /descendant-or-self::node()/. Zum Beispiel steht //para abk�rzend f�r /descendant-or-self::node()/child::para und w�hlt damit alle para-Elemente im Dokument aus (selbst ein para-Element, das ein Dokumentelement ist, wird durch //para ausgew�hlt, da der Dokumentelementknoten ein Kind des Wurzelknotens ist). div//para steht abk�rzend f�r div/descendant-or-self::node()/child::para und w�hlt daher alle para-Nachfolger von div-Kindern aus.

Anmerkung des �bersetzers:

Hier enth�lt das Originaldokument einen kleinen Fehler. Der vollst�ndige Lokalisierungspfad f�r das letzte Beispiel muss child::div/descendant-or-self::node()/child::para lauten.

Anmerkung: Der Lokalisierungspfad //para[1] bedeutet nicht das Gleiche wie /descendant::para[1]. Der zweite w�hlt das erste Nachkommenelement para aus, der erste w�hlt alle para-Nachkommen aus, die das erste Kind ihrer Eltern sind.

Anmerkung des �bersetzers:

Davon kann man sich durch Bestimmung des vollst�ndigen Ausdrucks leicht �berzeugen:

//para[1] = /descendant-or-self::node()/para[1]
          = /descendant-or-self::node()/child::para[1]

Das Pr�dikat [1] wirkt damit auf die durch die child-Achse im zweiten Lokalisierungsschritt bestimmte Knotenmenge, wogegen es in /descendant::para[1] zur descendant-Achse geh�rt.

Ein Lokalisierungsschritt . steht abk�rzend f�r self::node(). Das ist insbesondere in Verbindung mit // n�tzlich. Der Lokalisierungspfad .//para steht zum Beispiel abk�rzend f�r

self::node()/descendant-or-self::node()/child::para

und w�hlt daher alle para-Elemente aus, die Nachkommen des Kontextknotens sind.

Analog steht der Lokalisierungsschritt .. abk�rzend f�r parent::node(). Zum Beispiel steht ../title abk�rzend f�r parent::node()/child::title und w�hlt damit die title-Kindelemente des Elternknotens des Kontextknotens aus.

Anmerkung des �bersetzers:

Die Kombination aus . und / ist unn�tig und kann weggelassen werden. Ausdr�cke der Form ./title oder ./@name k�nnen k�rzer als title bzw. @name geschrieben werden.

Ein Blick in die unten stehende Grammatik zeigt, dass es sich bei . und .. um vollst�ndige Lokalisierungsschritte handelt. Ihnen k�nnen also keine Pr�dikate folgen. Ausdr�cke der Form .[self::par] oder ..[@name='foo'] sind nicht zul�ssig.

Abk�rzungen
[10]��� AbbreviatedAbsoluteLocationPath ���::=��� '//' RelativeLocationPath
[11]��� AbbreviatedRelativeLocationPath ���::=��� RelativeLocationPath '//' Step
[12]��� AbbreviatedStep ���::=��� '.'
| '..'
[13]��� AbbreviatedAxisSpecifier ���::=��� '@'?

3 Ausdr�cke

3.1 Grundlagen

Eine Variablenreferenz (VariableReference) ergibt den Wert, der an den Variablennamen innerhalb der Menge der Variablenbelegungen des Kontexts gebunden ist. Es ist ein Fehler, falls dem Variablennamen in der Menge der Variablenbelegungen aus dem Kontext des Ausdrucks kein Wert zugewiesen wurde.

Anmerkung des �bersetzers:

Der Name einer Variablen ist ein qualifizierter Name, kann also ein Pr�fix enthalten, das auf einen Namensraum verweist. Mittels des Zeichens $ wird auf den Wert einer Variablen zugegriffen.

Der letzte Satz des obigen Abschnitts bedeutet, dass Variablen vor ihrer Benutzung definiert worden sein m�ssen. Wie bereits erw�hnt, sieht XPath daf�r keinerlei Sprachelemente vor. In [XSLT] verwendete Variablen haben immer einen definierten Wert. So wird durch das leere Element eine Variable namens foo:var definiert und mit der leeren Zeichenkette belegt.

Zum Gruppieren k�nnen runde Klammern verwendet werden.

[14]��� Expr ���::=��� OrExpr
[15]��� PrimaryExpr ���::=��� VariableReference
| '(' Expr ')'
| Literal
| Number
| FunctionCall

3.2 Funktionsaufrufe

Ein Ausdruck, der ein Funktionsaufruf (FunctionCall) ist, wird ausgewertet, indem anhand des Funktionsnamens (FunctionName) die Funktion in der Funktionsbibliothek des Ausdruckskontexts bestimmt, jedes der Argumente (Argument) berechnet und in den von der Funktion erwarteten Typ konvertiert und schlie�lich die Funktion mit den konvertierten Argumenten aufgerufen wird. Es ist ein Fehler, wenn eine falsche Anzahl von Argumenten �bergeben wird oder eines der Argumente nicht in den geforderten Typ konvertiert werden kann. Das Ergebnis des Funktionsaufrufes (FunctionCall) ist der von der Funktion zur�ckgelieferte Wert.

Die Konvertierung eines Arguments in den Typ string geschieht so wie beim Aufruf der Funktion string. Die Konvertierung eines Arguments in den Typ number geschieht so wie beim Aufruf der Funktion number. Die Konvertierung eines Arguments in den Typ boolean geschieht so wie beim Aufruf der Funktion boolean. Ein Argument, das nicht vom Typ node-set ist, kann nicht in eine Knotenmenge konvertiert werden.

Anmerkung des �bersetzers:

Dieser letzte Satz stimmt insofern, als es keine automatische Konvertierung in eine Knotenmenge gibt. Zus�tzliche Funktionen k�nnen durchaus Werte anderer Typen als Parameter entgegennehmen und eine Knotenmenge zur�ckliefern. In vielen XSLT-1.0-konformen Prozessoren existiert beispielsweise eine Erweiterungsfunktion node-set, die f�r einen Ergebnisteilbaum dessen �quivalente Knotenmenge zur�ckliefert.

[16]��� FunctionCall ���::=��� FunctionName '(' ( Argument ( ',' Argument )* )? ')'
[17]��� Argument ���::=��� Expr

3.3 Knotenmengen

Ein Lokalisierungspfad kann als Ausdruck benutzt werden. Ein solcher Ausdruck liefert die durch den Pfad ausgew�hlte Knotenmenge.

Der Operator | berechnet die Vereinigung seiner Operanden, welche jeweils Knotenmengen sein m�ssen.

Anmerkung des �bersetzers:

Da es sich um eine Vereinigung von Mengen handelt, ist ein identischer Knoten in beiden Operanden in der Ergebnisknotenmenge auch nur einmal vorhanden. Zusammen mit der Funktion count (siehe [4.1 Funktionen auf Knotenmengen]) l�sst sich so die Identit�t zweier Knoten feststellen.

Die Knotenmenge $a ist in der Knotenmenge $b enthalten, falls count($b) = count($a | $b). $a und $b sind identisch, wenn $a in $b und $b in $a enthalten ist. Es handelt sich um einzelne Knoten, wenn au�erdem count($a) = 1 ist. Achtung: Der Operator = bestimmt die Gleichheit der Zeichenkettenwerte zweier Knoten (siehe [3.4 Boolesche Werte]), nicht deren Identit�t.

XPath definiert keine Operatoren f�r die Bestimmung von Durchschnitt und Differenz zweier Knotenmengen. Basierend auf dem Teilmengentest lassen sich diese Operationen allerdings berechnen:

Durchschnitt von $a und $b:

$a[count(.|$b) = count($b)]

Differenz von $a und $b:

$a[count(.|$b) != count($b)]

Damit l�sst sich nun auch testen, ob der Kontextknoten ein Attributknoten ist (analog f�r Namensraumknoten):

count(.|../@*) = count(../@*)

Die bedingte Auswahl einer Knotenmenge aus zwei Alternativen abh�ngig von einem logischen Ausdruck kann durch folgende Konstruktion erreicht werden:

node-set1[boolean-test] | node-set2[not(boolean-test)]

In den Programmiersprachen C, C++ und Java stellt der Fragezeichenoperator ?: diese Funktionalit�t bereit. Eine analoge Anwendung f�r Zeichenketten wird im Zusammenhang mit der Funktion substring in Kapitel [4.2 Zeichenkettenfunktionen] vorgestellt.

In XSLT-Mustern, die eine Teilmenge der XPath-Ausdr�cke bilden, wird der Operator | verwendet, um m�gliche Alternativen anzugeben.

Pr�dikate werden zum Filtern von Ausdr�cken in der gleichen Weise wie in Lokalisierungspfaden benutzt. Es ist ein Fehler, falls das Ergebnis des zu filternden Ausdrucks keine Knotenmenge ist. Das Pr�dikat filtert die Knotenmenge bez�glich der Kindachse.

Anmerkung: Die Bedeutung eines Pr�dikats h�ngt entscheidend davon ab, welche Achse angewendet wird. Zum Beispiel liefert preceding::foo[1] das erste foo-Element in umgekehrter Dokumentordnung, weil die f�r das Pr�dikat [1] anzuwendende Achse die Vorg�ngerachse (preceding) ist. Demgegen�ber liefert (preceding::foo)[1] das erste foo-Element in Dokumentordnung, weil die Achse, die in diesem Fall f�r das Pr�dikat [1] gilt, die Kindachse ist.

Anmerkung des �bersetzers:

Auf diesen Unterschied soll noch einmal deutlich hingewiesen werden: Pr�dikate, die Bestandteil eines Lokalisierungsschrittes sind, filtern eine Knotenmenge bez�glich der im Lokalisierungsschritt verwendeten Achse. F�r jeden Knoten der Knotenmenge ist daher dessen N�heposition relevant. Pr�dikate, die auf einen XPath-Ausdruck angewendet werden, interpretieren die betreffenden Knoten immer in Dokumentordnung, da laut Definition in solch einem Fall die Kindachse anzuwenden ist.

Im obigen Beispiel preceding::foo[1] ist das Pr�dikat [1] Bestandteil des Lokalisierungsschrittes preceding::foo[1], w�hrend bei (preceding::foo)[1] das Pr�dikat [1] auf den Ausdruck (preceding::foo) angewendet wird (welcher in diesem Fall ein Lokalisierungsschritt ohne Pr�dikat ist).

Das folgende Beispiel stellt den Sachverhalt aus einer praxisn�heren Sicht dar. Es gibt zwar die Achse ancestor-or-self, welche neben allen Vorfahren auch den Kontextknoten ausw�hlt, es gibt aber keine entsprechende Achse preceding-or-self, die alle Vorg�nger inklusive des Kontextknotens ausw�hlen k�nnte. Die gew�nschte Knotenmenge muss also durch eine Vereinigung konstruiert werden: preceding::node() | self::node(). Bei der Anwendung eines oder mehrerer Pr�dikate auf die entstehende Menge, etwa (preceding::node() | .)[@id][1], muss man beachten, dass die Knoten nun in Dokumentordnung gefiltert werden. Der Ausdruck liefert damit den ersten Knoten im Dokument, der ein Vorg�nger des Kontextknotens ist und ein Attribut id besitzt, und nicht den zum Kontextknoten n�chsten Knoten mit dieser Eigenschaft.

Bei der Betrachtung des Beispiels (preceding-sibling::* | following-sibling::*)[1] wird klar, dass f�r solche Ausdr�cke eine von den beteiligten Achsen abh�ngende Knotenordnung nicht praktikabel ist.

An dieser Stelle sei darauf hingewiesen, dass �ber die in [XSLT] definierte Funktion document auch Knotenmengen aus verschiedenen Dokumenten miteinander vereinigt werden k�nnen. In diesem Fall gibt es keine definierte Dokumentordnung f�r die Vereinigungsmenge mehr. Die Anwendung eines entsprechenden Pr�dikats ist damit implementationsabh�ngig. Entsprechendes gilt bei einer Knotenmenge, die die Attribute eines Elements enth�lt.

Die Operatoren / und // verbinden einen Ausdruck und einen relativen Lokalisierungspfad. Es ist ein Fehler, wenn die Berechnung des Ausdrucks keine Knotenmenge ergibt. Der Operator / arbeitet dabei in der gleichen Weise wie in einem Lokalisierungspfad. Ebenso wie in Lokalisierungspfaden steht // abk�rzend f�r /descendant-or-self::node()/.

Es gibt keine Objekte, die in eine Knotenmenge konvertiert werden k�nnen.

Anmerkung des �bersetzers:

Angenommen, eine Variable namens divs enth�lt eine Knotenmenge von diversen div-Elementen (div1, div2, etc). Dann kann mittels $divs[1] auf das erste dieser Elemente zugegriffen werden. $divs/@id liefert die Menge der id-Attributknoten der Elemente aus $divs, $divs//image liefert die Menge aller image-Elemente, die Nachkommen eines in $divs enthaltenen div-Elements sind.

Dabei ist zu beachten, dass sich einem Ausdruck anschlie�ende Lokalisierungsschritte immer auf die Position der Knoten im XML-Dokument beziehen und nicht auf die durch den Ausdruck berechnete Knotenmenge. Beispielsweise bestimmt $divs[1]/following-sibling::* den nachfolgenden Geschwisterknoten des ersten Knotens aus $divs im XML-Dokument, und nicht den "Nachfolger" in $divs, also $divs[2]. Allgemein gesprochen gibt es keinen Weg, der es erlaubt, ausgehend von einem Kontextknoten, der Element einer zuvor bestimmten Knotenmenge ist, auf die anderen Knoten dieser Menge zuzugreifen. Das betrifft insbesondere Ausdr�cke, die in Pr�dikaten oder im K�rper der XSLT-Anweisung xsl:for-each auftreten.

Ausdr�cke, speziell Variablen, d�rfen nur vor / und // auftreten. Es ist nicht m�glich, Ausdr�cke dynamisch zusammenzusetzen, wie man es etwa mit /root/$element versuchen k�nnte. Eine M�glichkeit, innerhalb eines Pfades dynamisch ein bestimmtes Element auszuw�hlen, wird im Zusammenhang mit der Funktion name vorgestellt.

Wie schon gesagt wurde, muss ein Ausdruck, dem ein Pr�dikat oder einer der Operatoren / und // folgt, immer eine Knotenmenge als Ergebnis liefern. Da Objekte anderer Typen nicht in eine Knotenmenge konvertiert werden k�nnen, f�hrt die Auswertung eines Ausdrucks, der keine Knotenmenge ergibt, in diesem Fall zu einem Fehler. XPath nutzende Spezifikationen und Implementationen k�nnen jedoch explizit zus�tzliche Funktionen definieren, die beliebige Objekte in Knotenmengen �berf�hren.

[18]��� UnionExpr ���::=��� PathExpr
| UnionExpr '|' PathExpr
[19]��� PathExpr ���::=��� LocationPath
| FilterExpr
| FilterExpr '/' RelativeLocationPath
| FilterExpr '//' RelativeLocationPath
[20]��� FilterExpr ���::=��� PrimaryExpr
| FilterExpr Predicate

3.4 Boolesche Werte

Ein Objekt vom Typ boolean kann zwei Werte annehmen, wahr und falsch.

Die Berechnung eines or-Ausdrucks erfolgt, indem jeder der Operanden berechnet und in einen booleschen Wert wie beim Aufruf der Funktion boolean konvertiert wird. Das Ergebnis ist der Wert wahr, wenn einer der beiden Werte wahr ist, und andernfalls falsch. Der rechte Operand wird nicht mehr ausgewertet, wenn der linke Operand wahr ergibt.

Die Berechnung eines and-Ausdrucks erfolgt, indem jeder der Operanden berechnet und in einen booleschen Wert wie beim Aufruf der Funktion boolean konvertiert wird. Das Ergebnis ist der Wert wahr, wenn beide Werte wahr sind, und andernfalls falsch. Der rechte Operand wird nicht mehr ausgewertet, wenn der linke Operand falsch ergibt.

Anmerkung des �bersetzers:

Mit dieser Regelung l�sst sich die Berechnung von Teilausdr�cken und der Aufruf enthaltener Funktionen verhindern. Abgesehen von Performance-Aspekten hat sie im Zusammenhang mit XSLT allerdings nicht die gleiche Bedeutung wie in anderen Programmiersprachen.

So arbeiten alle XSLT-Funktionen ohne Seiteneffekte (sie produzieren weder Ausgaben noch �ndern sie Variableninhalte); Funktionsparameter werden automatisch in den geforderten Typ konvertiert und mathematische Operationen liefern immer einen definierten Wert. Lediglich Typfehler k�nnen auftreten, falls ein Ausdruck als Operand oder Funktionsparameter eine Knotenmenge verlangt. Allerdings gibt es in XPath keine M�glichkeit festzustellen, ob ein Teilausdruck vom Typ Knotenmenge ist.

Da sich �ber Erweiterungsmechanismen jedoch Funktionen definieren lassen, die die genannten Eigenschaften nicht mehr besitzen, kann �ber eine Verkn�pfung mit or oder and der Aufruf solcher Funktionen bei Bedarf verhindert werden.

Die Berechnung eines EqualityExpr-Ausdrucks (der nicht allein ein RelationalExpr-Ausdruck ist) oder eines RelationalExpr-Ausdrucks (der nicht allein ein AdditiveExpr-Ausdruck ist) geschieht, indem die Objekte miteinander verglichen werden, die im Ergebnis der Auswertung der beiden Operanden entstehen. Die folgenden drei Abs�tze definieren den Vergleich zwischen den daraus resultierenden Objekten. Erst werden Vergleiche, die Knotenmengen betreffen, �ber Vergleiche definiert, die keine Knotenmengen betreffen; dies geschieht einheitlich f�r =, !=, <=, <, >= und >. Dann werden Vergleiche, die keine Knotenmengen betreffen, f�r = und != definiert. Schlie�lich werden Vergleiche, die keine Knotenmengen betreffen, f�r <=, <, >= und > definiert.

Wenn beide zu vergleichenden Objekte Knotenmengen sind, so liefert ein Vergleich genau dann den Wert wahr, wenn es einen Knoten aus der ersten Knotenmenge und einen Knoten aus der zweiten Knotenmenge gibt, sodass das Ergebnis des Vergleichs der Zeichenkettenwerte dieser beiden Knoten wahr ergibt. Wenn eines der zu vergleichenden Objekte eine Knotenmenge und das andere eine Zahl ist, dann liefert ein Vergleich genau dann den Wert wahr, wenn es einen Knoten in der Knotenmenge gibt, sodass der Vergleich zwischen der Zahl und dem Ergebnis der Konvertierung des Zeichenkettenwerts dieses Knotens zu einer Zahl �ber die Funktion number wahr ergibt. Wenn eines der zu vergleichenden Objekte eine Knotenmenge und das andere eine Zeichenkette ist, dann liefert ein Vergleich genau dann den Wert wahr, wenn es einen Knoten in der Knotenmenge gibt, sodass der Vergleich zwischen der Zeichenkette und dem Zeichenkettenwert dieses Knotens wahr ergibt. Wenn eines der zu vergleichenden Objekte eine Knotenmenge und das andere ein boolescher Wert ist, dann liefert ein Vergleich genau dann den Wert wahr, wenn es einen Knoten in der Knotenmenge gibt, sodass der Vergleich zwischen dem booleschen Wert und dem Ergebnis der Konvertierung des Zeichenkettenwerts dieses Knotens zu einem boolschen Wert �ber die Funktion boolean wahr ergibt.

Wenn keines der zu vergleichenden Objekte eine Knotenmenge ist und als Operator = oder != vorkommt, so werden die Objekte wie nachfolgend beschrieben in einen gemeinsamen Typ konvertiert und anschlie�end verglichen. Wenn wenigstens eines der zu vergleichenden Objekte ein boolescher Wert ist, wird jedes Objekt wie bei der Anwendung der Funktion boolean in einen booleschen Wert konvertiert. Wenn wenigstens eines der zu vergleichenden Objekte eine Zahl ist, wird jedes Objekt wie bei der Anwendung der Funktion number in eine Zahl konvertiert. Andernfalls werden beide Objekte wie bei der Anwendung der Funktion string in Zeichenketten konvertiert. Der Vergleich = liefert als Ergebnis genau dann den Wert wahr, wenn beide Objekte gleich sind; der Vergleich != liefert als Ergebnis genau dann den Wert wahr, wenn beide Objekte ungleich sind. Zahlen werden gem�� IEEE 754 [IEEE 754] verglichen. Zwei boolesche Werte sind gleich, wenn sie entweder beide wahr oder beide falsch sind. Zwei Zeichenketten sind genau dann gleich, wenn sie aus derselben Folge von UCS-Zeichen bestehen.

Anmerkung: Wenn $x mit einer Knotenmenge belegt ist, dann bedeutet $x="foo" nicht dasselbe wie not($x!="foo"): Der erste Vergleich ergibt genau dann wahr, wenn ein Knoten in $x den Zeichenkettenwert foo hat; der zweite ergibt genau dann wahr, wenn alle Knoten in $x den Zeichenkettenwert foo haben.

Anmerkung des �bersetzers:

Der Vergleich $x!="foo" ist genau dann wahr, wenn es wenigstens einen Knoten aus $x gibt, f�r den die Ungleichheit gilt, d.h. falsch, wenn es keinen solchen Knoten gibt. Damit ist not($x!="foo") wahr, wenn es keinen Knoten aus $x gibt, dessen Zeichenkettenwert verschieden von foo ist, d.h. wenn alle Knoten den Zeichenkettenwert foo besitzen.

Ein h�ufigerer Fall d�rfte der Test auf Ungleichheit sein. Man m�chte z.B. feststellen, ob der Wert eines Ausdrucks verschieden von allen Kindelementen entry ist. Die L�sung lautet in diesem Fall nicht entry!="foo" (hier wird auf alle entry-Kindelemente zugegriffen und getestet, ob unter diesen eines existiert, das verschieden von der Zeichenkette "foo" ist), sondern not(entry="foo").

Bemerkenswert ist noch der Fall, dass die beteiligte Knotenmenge leer ist. Ein Vergleich @type!="warning" ist falsch, wenn kein Attribut type existiert. Dagegen liefert not(@type="warning") in diesem Fall den Wert wahr.

Es sei noch einmal darauf hingewiesen, dass f�r Knotenmengen mit den Operatoren = und != nicht die Identit�t von Knoten getestet wird, sondern die ihrer Zeichenkettenwerte. Zwei Knoten k�nnen unter Zuhilfenahme des Operators | auf Identit�t getestet werden, siehe Anmerkung in Kapitel [3.3 Knotenmengen].

Wenn keines der zu vergleichenden Objekte eine Knotenmenge ist und als Operator <=, <, >= oder > vorkommt, so werden beide Objekte in Zahlen konvertiert und anschlie�end gem�� IEEE 754 verglichen. Der Vergleich < ergibt genau dann den Wert wahr, wenn die erste Zahl kleiner als die zweite Zahl ist. Der Vergleich <= ergibt genau dann den Wert wahr, wenn die erste Zahl kleiner oder gleich der zweiten Zahl ist. Der Vergleich > ergibt genau dann den Wert wahr, wenn die erste Zahl gr��er als die zweite Zahl ist. Der Vergleich >= ergibt genau dann den Wert wahr, wenn die erste Zahl gr��er oder gleich der zweiten Zahl ist.

Anmerkung des �bersetzers:

Somit sind Vergleiche, an denen Knotenmengen beteiligt sind, dann erf�llt, wenn sich wenigstens ein Knoten aus der jeweiligen Menge finden l�sst, dessen Zeichenkettenwert den Vergleich erf�llt. Insbesondere liefert der Vergleich mit wenigstens einer leeren Menge in jedem Fall den Wert falsch. Sind nur Werte verschiedener skalarer Typen beteiligt, so wird in der Rangfolge "boolescher Wert – Zahl – Zeichenkette" ein gemeinsamer Typ gesucht und der jeweils andere Wert konvertiert. Gr��envergleiche sind nur f�r Zahlen definiert.

Unter Ausnutzung dieser Regeln kann z.B. die kleinste Zahl in einer Knotenmenge $set folgenderma�en bestimmt werden:

$set[not(. > $set)]

Ein Vergleich mit dem speziellen Zahlenwert NaN (Not a Number) liefert immer den Wert falsch, selbst bei number('NaN')=number('NaN'). Bei 'NaN' handelt es sich hier nicht um eine spezielle Zeichenkette, die in den Wert NaN konvertiert wird, sondern einfach um eine, die sich nicht konvertieren l�sst. K�nnen in der Beispielmenge $set auch Knoten auftreten, deren Zeichenkettenwert sich nicht in eine Zahl konvertieren l�sst, k�nnte man den obigen Ausdruck auf folgende, etwas unkonventionelle Weise vervollst�ndigen:

$set[number()=number() and not(. > $set)]

Vorsicht ist geboten, wenn die Werte einer Knotenmenge vor dem Vergleich durch eine Funktion mit skalarem Argumenttyp bearbeitet werden sollen. �bergibt man der Funktion die gesamte Knotenmenge als Argument, wird nur mit dem Funktionswert des ersten Knotens verglichen. Die spezielle Semantik des Vergleichs mit Knotenmengen geht verloren. In der Anmerkung zur Funktion normalize-space wird dies an einem Beispiel ausf�hrlicher erl�utert.

XPath stellt keine M�glichkeit zur Verf�gung, mit der man Zeichenketten lexikographisch der Gr��e nach vergleichen k�nnte. Abh�ngig vom Anwendungsfall lassen sich in XSLT solche Vergleiche durch die Programmierung rekursiver Templates oder die Benutzung des xsl:sort-Elements realisieren.

Anmerkung: Wenn ein XPath-Ausdruck in einem XML-Dokument vorkommt, m�ssen alle Operatoren < und <= gem�� den XML-1.0-Regeln gesch�tzt werden, zum Beispiel als < und <=. Im folgenden Beispiel ist der Wert des Attributes test ein XPath-Ausdruck:
...
[21]��� OrExpr ���::=��� AndExpr
| OrExpr 'or' AndExpr
[22]��� AndExpr ���::=��� EqualityExpr
| AndExpr 'and' EqualityExpr
[23]��� EqualityExpr ���::=��� RelationalExpr
| EqualityExpr '=' RelationalExpr
| EqualityExpr '!=' RelationalExpr
[24]��� RelationalExpr ���::=��� AdditiveExpr
| RelationalExpr '<' AdditiveExpr
| RelationalExpr '>' AdditiveExpr
| RelationalExpr '<=' AdditiveExpr
| RelationalExpr '>=' AdditiveExpr
Anmerkung: Mit der obigen Grammatik ergibt sich folgende Vorrangfolge (kleinster Vorrang zuerst): Alle Operatoren sind links-assoziativ. Beispielsweise ist 3 > 2 > 1 �quivalent zu (3 > 2) > 1, was den Wert falsch ergibt.

Anmerkung des �bersetzers:

Der Vergleich 3 > 2 ergibt zun�chst den Wert wahr. Dieses Ergebnis wird aufgrund des folgenden Vergleichsoperators > in die Zahl 1 konvertiert, sodass nun 1 > 1 berechnet wird, was den Wert falsch liefert. Auf analoge Weise kann man sich �berlegen, dass der Ausdruck 2 = 1 = 0 wahr, der Ausdruck 0 = 0 = 0 hingegen falsch ergibt.

Hier ist Vorsicht geboten, da solche Ausdr�cke gem�� der XPath-Grammatik erlaubt sind, aber nicht die Semantik besitzen, die man auf den ersten Blick erwarten w�rde. Sie verhalten sich allerdings genauso wie beispielsweise in den Programmiersprachen C und C++.

3.5 Zahlen

Ein Wert vom Typ number repr�sentiert eine Gleitkommazahl. Eine Zahl kann jeden beliebigen, doppelt-genauen 64-Bit-Wert des Formats IEEE 754 [IEEE 754] annehmen. Dies beinhaltet den speziellen Wert "Not-a-Number" (NaN), positiv und negativ unendlich, sowie positiv und negativ Null. F�r eine Zusammenfassung der wichtigsten Regeln des IEEE-754-Standards siehe Abschnitt 4.2.3 in [JLS].

Anmerkung des �bersetzers:

Die genannten speziellen Werte entstehen dann, wenn eine Rechenoperation einen �berlauf produzieren w�rde bzw. das Ergebnis nicht definiert ist. Beim Rechnen mit Zahlen in XPath k�nnen keine Fehler oder Ausnahmen auftreten.

An dieser Stelle sei bereits kurz auf die Produktion f�r Number in [3.7 Lexikalische Struktur] hingewiesen. Zahlen in XPath sind Gleitkommazahlen ohne Exponentendarstellung. Eine Schreibweise 2.99792E+08 ist nicht zul�ssig. Sie k�nnen ein negatives, aber kein explizites positives Vorzeichen besitzen. Soll einer der speziellen Werte wie z.B. positiv unendlich verwendet werden, muss dieser ermittelt werden, etwa durch 1 div 0.

Es gibt in XPath weder einen speziellen Typ f�r ganzzahlige Werte noch gesonderte Zahlendarstellungen, die eine Zahl als Oktal- oder Hexadezimalzahl interpretieren, wie dies in vielen Programmiersprachen m�glich ist.

Die numerischen Operatoren konvertieren ihre Operanden in Zahlen, so wie bei einem Aufruf der Funktion number.

Der Operator + addiert.

Der Operator - subtrahiert.

Anmerkung des �bersetzers:

Gem�� Errata-Dokument [XPath Errata] ist die Semantik des einstelligen Operators - nicht spezifiziert. Stattdessen muss dieser letzte Absatz lauten:

Der zweistellige Operator - subtrahiert. Der einstellige Operator - berechnet die Negation. Beachten Sie, dass -0 negativ Null ergibt.
Anmerkung: Da XML innerhalb von Namen das Zeichen - erlaubt, muss der Operator - typischerweise von einem Leerraumzeichen angef�hrt werden. Zum Beispiel ergibt foo-bar eine Knotenmenge, die die Kindelemente namens foo-bar enth�lt; foo - bar ergibt die Differenz aus den Werten, die durch Konvertierung des Zeichenkettenwertes des ersten foo-Kindelements in eine Zahl und durch Konvertierung des Zeichenkettenwertes des ersten bar-Kindelements in eine Zahl entstehen.

Anmerkung des �bersetzers:

Gem�� Errata-Dokument [XPath Errata] ist die Semantik des Operators * nicht spezifiziert. An dieser Stelle muss folgender Absatz eingef�gt werden:

Der Operator * berechnet eine Gleitkomma-Multiplikation gem�� IEEE 754. Beachten Sie: Falls das Ergebnis nicht NaN ist, ist das Ergebnis genau dann positiv, wenn beide Operanden das gleiche Vorzeichen besitzen.

Das Zeichen * dient zugleich als Knotentest zur Auswahl beliebiger Elemente. Welche Semantik ein * innerhalb eines XPath-Ausdrucks hat, h�ngt damit von den umgebenden Tokens in diesem Ausdruck ab (siehe [3.7 Lexikalische Struktur]).

Der Operator div berechnet eine Gleitkomma-Division gem�� IEEE 754.

Anmerkung des �bersetzers:

Gem�� Errata-Dokument [XPath Errata] muss an dieser Stelle folgender Satz eingef�gt werden:

Beachten Sie: Falls das Ergebnis nicht NaN ist, ist das Ergebnis genau dann positiv, wenn beide Operanden das gleiche Vorzeichen besitzen.

Der Schr�gstrich / ist nicht der Divisionsoperator, da dieser bereits als Pfadoperator zum Verbinden von Lokalisierungsschritten sowie als Symbol f�r den Wurzelknoten benutzt wird. Im Gegensatz zum Zeichen * gibt es hier nicht mehrere Interpretationsm�glichkeiten.

Der Operator mod liefert den Rest einer ganzzahligen Division. Beispiele:

Anmerkung: mod berechnet dasselbe wie der Operator % in Java und ECMAScript.
Anmerkung: Er berechnet nicht dasselbe wie die IEEE-754-Rest-Operation, welche den Rest einer gerundeten Division liefert.

Anmerkung des �bersetzers:

Der mod-Operator berechnet den genauen Rest, der sich bei der ganzzahligen Division zweier Gleitkommazahlen ergibt, ohne die Operanden zuvor auf ganze Zahlen zu runden.

Numerische Ausdr�cke
[25]��� AdditiveExpr ���::=��� MultiplicativeExpr
| AdditiveExpr '+' MultiplicativeExpr
| AdditiveExpr '-' MultiplicativeExpr
[26]��� MultiplicativeExpr ���::=��� UnaryExpr
| MultiplicativeExpr MultiplyOperator UnaryExpr
| MultiplicativeExpr 'div' UnaryExpr
| MultiplicativeExpr 'mod' UnaryExpr
[27]��� UnaryExpr ���::=��� UnionExpr
| '-' UnaryExpr

3.6 Zeichenketten

Zeichenketten bestehen aus einer Folge von null oder mehr Zeichen, wobei Zeichen wie in der XML-Empfehlung [XML] definiert sind. Ein einzelnes XPath-Zeichen entspricht damit einem einzelnen abstrakten Unicode-Zeichen mit einem einzelnen korrespondierenden skalaren Wert (siehe [Unicode]); dies unterscheidet sich allerdings von einem 16-Bit-kodierten Unicode-Zeichen: Die durch Unicode definierte kodierte Zeichenrepr�sentation eines abstrakten Zeichens mit einem skalaren Wert gr��er als U+FFFF ist ein Paar von 16-Bit Unicode-Codes (ein Surrogat-Paar). In vielen Programmiersprachen wird eine Zeichenkette als Folge von 16-Bit-kodierten Unicode-Zeichen repr�sentiert; XPath-Implementationen in solchen Sprachen m�ssen sicherstellen, dass ein Surrogat-Paar korrekt als einzelnes XPath-Zeichen behandelt wird.

Anmerkung: In Unicode ist es m�glich, dass zwei Zeichenketten als identisch anzusehen sind, obwohl sie aus unterschiedlichen Folgen abstrakter Unicode-Zeichen bestehen. Zum Beispiel k�nnen einige Akzentzeichen entweder in einer vordefinierten (precomposed) oder einer zerlegten (decomposed) Form repr�sentiert werden. Damit k�nnen XPath-Ausdr�cke unerwartete Resultate liefern, es sei denn, sowohl die Zeichen im XPath-Ausdruck als auch die im XML-Dokument wurden zu einer kanonischen Form normalisiert (siehe [Character Model]).

Anmerkung des �bersetzers:

Ein zusammengesetztes Zeichen, das sich auch als vordefiniertes Zeichen kodieren l�sst, wird durch einen einzigen Unicode-Code repr�sentiert. Beispielsweise l�sst sich der Umlaut ��� als U+00FC darstellen. Zugleich kann dieser Buchstabe auch wie jedes zusammengesetzte Zeichen in der zerlegten Form durch die Folge der beiden Codes U+0075 (�u�) und U+0308 (combining diaeresis) kodiert werden.

3.7 Lexikalische Struktur

Beim Zerlegen in einzelne Tokens wird immer das l�ngstm�gliche Token zur�ckgeliefert.

Zur besseren Lesbarkeit k�nnen Leerraumzeichen innerhalb von Ausdr�cken verwendet werden, auch wenn es nicht explizit durch die Grammatik erlaubt wurde: ExprWhitespace kann innerhalb von Ausdr�cken frei vor oder nach beliebigen ExprTokens eingef�gt werden.

Anmerkung des �bersetzers:

An dieser Stelle sei auf die Anmerkung zum Operator f�r die Subtraktion, das zweistellige Minus, in [3.5 Zahlen] hingewiesen. Der erste Absatz legt fest, dass �foo-bar� nur als einzelnes Token interpretiert werden darf und nicht als Folge der Tokens �foo�, �-� und �bar�. Der zweite Absatz erlaubt nun explizit, beispielsweise den Minus-Operator mittels Leerraumzeichen als einzeln zu interpretierendes Token zu kennzeichnen.

�blicherweise unterscheidet man bei der Definition einer Sprache zwischen lexikalischen Produktionen, die den Aufbau der lexikalischen Einheiten, so genannter Tokens festlegen, und syntaktischen Produktionen, die die m�gliche Kombination dieser Tokens zu komplexeren Konstrukten beschreiben. In der XPath-Spezifikation sind diese beiden Arten von Produktionen allerdings nicht streng voneinander abgegrenzt. Der Hauptunterschied zwischen lexikalischen und syntaktischen Produktionen besteht darin, dass zwischen einzelnen Tokens Leerraumzeichen auftreten d�rfen, nicht jedoch innerhalb eines Tokens. Die Produktion f�r das Nichtterminal ExprToken stellt damit die oberste lexikalische Produktion dar. Daraus ergibt sich, dass ein Leerzeichen zwischen @ und einem QName zur Abk�rzung der attribute-Achse erlaubt ist, nicht aber zwischen $ und einem QName bei Variablenreferenzen.

Die folgenden speziellen Regeln f�r die Zerlegung in Tokens m�ssen in der angegebenen Reihenfolge angewendet werden, um die Grammatik ExprToken eindeutig zu machen:

Anmerkung des �bersetzers:

Im zweiten Aufz�hlungspunkt des Originaldokuments hat sich ein Fehler eingeschlichen. Da Funktionsnamen mit einem Pr�fix ausgestattet sein k�nnen, muss laut Errata-Dokument [XPath Errata] auf QName statt auf NCName verwiesen werden. Alle Standardfunktionen aus XPath, XSLT und XPointer besitzen zwar nur Namen ohne Pr�fix, der Erweiterungsmechanismus in XSLT erlaubt jedoch XSLT-Implementationen, zus�tzliche Funktionen aus einem propriet�ren Namensraum zur Verf�gung zu stellen.

Das hier diskutierte Problem der Mehrdeutigkeit umgeht man in vielen anderen Programmiersprachen durch die Definition von Schl�sselw�rtern, die dann f�r frei w�hlbare Bezeichner nicht mehr zur Verf�gung stehen. Ein XML-Autor ist jedoch frei in seiner Wahl der Element- und Attributnamen, also muss auch die Sprache XPath damit umgehen k�nnen. Die gefundene Regelung erm�glicht eine kompakte Schreibweise f�r XPath-Ausdr�cke und b�rdet die Last der eindeutigen Interpretation der jeweiligen XPath-Implementation auf.

Die folgenden Beispiele zeigen, wie Bezeichner (und der *-Operator) abh�ngig vom Kontext unterschiedlich interpretiert werden m�ssen:

  • ***

    bestimmt jeweils den in eine Zahl konvertierten Zeichenkettenwert der ersten Knoten in den durch * repr�sentierten Knotenmengen aller Kindelemente und multipliziert diese miteinander, d.h. das erste und dritte * werden als Lokalisierungspfad, das mittlere * als Multiplikationsoperator interpretiert.

  • and or mod

    ergibt den Wert wahr, wenn der Kontextknoten wenigstens ein Kindelement namens and oder ein Kindelement namens mod besitzt (Operatorname versus Elementname).

  • text and text()

    ergibt den Wert wahr, wenn der Kontextknoten sowohl wenigstens ein Element namens text als auch wenigstens einen Textknoten als Kinder besitzt (Knotentyp versus Elementname).

  • position() = position

    ergibt den Wert wahr, wenn die aktuelle Kontextposition mit dem in eine Zahl konvertierten Zeichenkettenwert eines Kindelements namens position �bereinstimmt (Funktionsname versus Elementname).

  • parent or parent::child

    ergibt den Wert wahr, wenn der Kontextknoten ein Kindelement namens parent oder ein Elternelement namens child besitzt (Achsenname versus Elementname).

Lexikalische Struktur von Ausdr�cken
[28]��� ExprToken ���::=��� '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::'
| NameTest
| NodeType
| Operator
| FunctionName
| AxisName
| Literal
| Number
| VariableReference
[29]��� Literal ���::=��� '"' [^"]* '"'
| "'" [^']* "'"
[30]��� Number ���::=��� Digits ('.' Digits?)?
| '.' Digits
[31]��� Digits ���::=��� [0-9]+
[32]��� Operator ���::=��� OperatorName
| MultiplyOperator
| '/' | '//' | '|' | '+' | '-' | '=' | '!=' | '<' | '<=' | '>' | '>='
[33]��� OperatorName ���::=��� 'and' | 'or' | 'mod' | 'div'
[34]��� MultiplyOperator ���::=��� '*'
[35]��� FunctionName ���::=��� QName - NodeType
[36]��� VariableReference ���::=��� '$' QName
[37]��� NameTest ���::=��� '*'
| NCName ':' '*'
| QName
[38]��� NodeType ���::=��� 'comment'
| 'text'
| 'processing-instruction'
| 'node'
[39]��� ExprWhitespace ���::=��� S

4 Bibliothek der Grundfunktionen

Dieser Abschnitt beschreibt die Funktionen, die bei einer XPath-Implementation immer in der bei der Auswertung von Ausdr�cken benutzten Funktionsbibliothek enthalten sein m�ssen.

Jede Funktion in der Funktionsbibliothek wird �ber einen Funktionsprototypen spezifiziert, der den R�ckgabetyp, den Namen der Funktion und die Typen der Argumente angibt. Falls ein Argument von einem Fragezeichen gefolgt wird, so ist es optional; andernfalls ist es obligatorisch.

Anmerkung des �bersetzers:

Ein Funktionsargument, dem ein Stern * folgt, darf keinmal, einmal oder mehrmals auftreten. Der Argumenttyp object steht f�r einen beliebigen Typ.

4.1 Funktionen auf Knotenmengen

Funktion: number last()

Die Funktion last liefert eine Zahl, die gleich der Kontextgr��e des Kontexts des ausgewerteten Ausdrucks ist.

Funktion: number position()

Die Funktion position liefert eine Zahl, die gleich der Kontextposition im Kontext des ausgewerteten Ausdrucks ist.

Funktion: number count(node-set)

Die Funktion count liefert die Anzahl der Knoten der �bergebenen Knotenmenge.

Anmerkung des �bersetzers:

F�r den letzten Knoten einer Knotenmenge gilt damit die Gleichheit position()=last(). Beachten Sie, dass die Nummerierung der Knoten bei 1 beginnt.

W�hrend last also die Kontextgr��e zur�ckgibt, d.h. die Anzahl der Knoten der Knotenmenge, in der sich der Kontextknoten befindet, berechnet count die Anzahl der Knoten einer beliebigen als Argument zu �bergebenden Knotenmenge. Es gibt keinen XPath-Ausdruck, der f�r einen beliebigen Knoten dessen Position in einer vorgegebenen Knotenmenge berechnet.

In bestimmten Situationen l�sst sich jedoch das Wissen �ber die Art der Beziehungen der Knoten in der Knotenmenge ausnutzen. M�chte man beispielsweise herausfinden, welche Position das erste para-Kind mit dem Attribut type="warning" unter allen para-Kindern besitzt, kann man einfach die diesem Element vorangehenden para-Geschwister z�hlen und 1 addieren:

count(para[@type="warning"]/preceding-sibling::para)+1

Diese Methode funktioniert hier deshalb, weil klar ist, dass alle para-Elemente Geschwister sind und auf die vorherigen Knoten der Menge daher �ber die Achse preceding-sibling zugegriffen werden kann. Wenn nicht bekannt ist, wie die Knotenmenge gebildet wurde, k�nnen die anderen Knoten auch nicht bestimmt und gez�hlt werden.

In Kapitel [3.3 Knotenmengen] wird im Zusammenhang mit dem Mengenvereinigungsoperator | gezeigt, wie die Funktion count zur Bestimmung von Durchschnitt und Differenz zweier Mengen genutzt werden kann.

Funktion: node-set id(object)

Die Funktion id w�hlt Elemente anhand ihrer eindeutigen ID aus (siehe [5.2.1 Eindeutige IDs]). Wenn als Argument eine Knotenmenge �bergeben wird, so ergibt sich das Ergebnis aus der Vereinigung der Knotenmengen, die durch den Aufruf von id mit dem Zeichenkettenwert jedes Knotens aus der �bergebenen Knotenmenge berechnet werden. Ist das Argument der Funktion id von einem beliebigen anderen Typ, so wird es wie bei einem Aufruf der Funktion string in eine Zeichenkette konvertiert; die Zeichenkette wird in eine durch Leerraumzeichen getrennte Liste von Tokens aufgeteilt (Leerraumzeichen sind beliebige Folgen von Zeichen, die sich aus der Produktion S ableiten lassen). Das Ergebnis ist eine Knotenmenge, die die Elemente aus dem Dokument des Kontextknotens enth�lt, die eine eindeutige ID mit dem gleichen Wert wie eines der Tokens der Liste besitzen.

Anmerkung des �bersetzers:

Diese Funktion erm�glicht die Auswertung von Attributen des Typs IDREF bzw. IDREFS. Da ein IDREF-Wert als ID an ein Element im gleichen XML-Dokument vergeben worden sein muss, l�sst sich dieses Element mit Hilfe der Funktion id bestimmen. Handelt es sich um mehrere IDs als Wert eines IDREFS-Attributs, liefert id alle zugeh�rigen Elemente als Knotenmenge.

Entsprechend der obigen Definition gilt also:

id("foo bar baz") = id("foo") | id("bar") | id("baz")

Die Knoten in der Ergebnisknotenmenge werden durch ein folgendes Pr�dikat in Dokumentordnung gefiltert und nicht in der Reihenfolge der angegebenen IDs.

Dagegen wird bei der �bergabe einer Knotenmenge, wie im Beispiel id(foo), von allen Knoten der Menge deren Zeichenkettenwert als Parameter verarbeitet und dieser wie ein IDREFS-Attribut interpretiert. Das Ergebnis ist die Vereinigung aller auf diese Weise bestimmten Knoten.

Die Funktion id kann aber nur korrekt arbeiten, wenn ID-wertige Attribute als solche erkannt werden. Dazu muss die DTD bekannt und vom Parser ausgewertet worden sein. Dies ist einer der wenigen F�lle, in denen das Ergebnis eines XPath-Ausdrucks von der Kenntnis der DTD des Dokuments abh�ngt. Fehlt diese Information, liefert id immer eine leere Knotenmenge.

Es gibt keine komplement�re Funktion, die f�r ein Element dessen ID zur�ckliefert. Unter Zuhilfenahme von id l�sst sich diese Information allerdings herausfinden. Gesucht ist n�mlich genau das Attribut, f�r das die Funktion id den Elternknoten dieses Attributs liefert:

@*[id(.) and count(id(.)|..)=1]

Funktion: string local-name(node-set?)

Die Funktion local-name liefert den lokalen Teil des erweiterten Namens des ersten Knotens in der Argumentknotenmenge bez�glich der Dokumentordnung. Falls die �bergebene Knotenmenge leer ist oder der erste Knoten keinen erweiterten Namen besitzt, wird eine leere Zeichenkette zur�ckgegeben. Wird kein Argument �bergeben, wird stattdessen eine Knotenmenge mit dem Kontextknoten als einzigem Element benutzt.

Anmerkung des �bersetzers:

F�r Element- und Attributknoten gilt damit, dass die Funktion local-name den dem Doppelpunkt folgenden Teil des QName zur�ckgibt bzw. den vollst�ndigen Namen, wenn dieser kein Pr�fix enth�lt. Die folgenden Beispiele demonstrieren dies unter der Voraussetzung, dass der als jeweiliges Argument �bergebene Lokalisierungspfad nicht die leere Knotenmenge ergibt:

local-name(xhtml:body) = "body"
local-name(@xlink:href) = "href"
local-name(para) = "para"

F�r Namensraumknoten liefert local-name das zugewiesene Pr�fix, also beispielsweise f�r die Deklaration xmlns:xlink="http://www.w3.org/1999/xlink" die Zeichenkette �xlink�. F�r Namensraumknoten, die den voreingestellten Namensraum repr�sentieren, wird die leere Zeichenkette zur�ckgegeben.

F�r Processing Instructions liefert local-name das jeweilige Ziel, also beispielsweise f�r die Zeichenkette �xml-stylesheet�.

F�r Textknoten, Kommentare und den Wurzelknoten liefert local-name die leere Zeichenkette.

Funktion: string namespace-uri(node-set?)

Die Funktion namespace-uri liefert den Namensraum-URI des erweiterten Namens des ersten Knotens in der Argumentknotenmenge bez�glich der Dokumentordnung. Falls die �bergebene Knotenmenge leer ist, der erste Knoten keinen erweiterten Namen besitzt oder der Namensraum-URI des erweiterten Namens leer ist, wird eine leere Zeichenkette zur�ckgegeben. Wird kein Argument �bergeben, wird stattdessen eine Knotenmenge mit dem Kontextknoten als einzigem Element benutzt.

Anmerkung: Die von der Funktion namespace-uri zur�ckgegebene Zeichenkette ist au�er f�r Element- oder Attributknoten immer leer.

Anmerkung des �bersetzers:

Beispiele: namespace-uri(xhtml:body) liefert den zum Pr�fix xhtml geh�renden Namensraum-URI (z.B. �http://www.w3.org/1999/xhtml�), entsprechend ergibt namespace-uri(@xlink:href) die Zeichenkette �http://www.w3.org/1999/xlink�, falls das Pr�fix xlink an diesen URI gebunden wurde. F�r Elementknoten aus dem voreingestellten Namensraum liefert namespace-uri den dazugeh�rigen URI. F�r Element- und Attributknoten, die keinem Namensraum angeh�ren, wird die leere Zeichenkette zur�ckgegeben.

Funktion: string name(node-set?)

Die Funktion name liefert eine Zeichenkette mit einem QName, die den erweiterten Namen des ersten Knotens in der Argumentknotenmenge bez�glich der Dokumentordnung repr�sentiert. Der QName muss den erweiterten Namen unter Ber�cksichtigung der Namensraumdeklarationen repr�sentieren, die f�r den Knoten g�ltig sind, dessen erweiterter Name repr�sentiert wird. Typischerweise ist das der QName, der in der XML-Quelle vorkommt. Das muss nicht der Fall sein, wenn es f�r den Knoten Namensraumdeklarationen gibt, die dem gleichen Namensraum mehrere Pr�fixe zuordnen. Allerdings kann eine Implementation Informationen �ber das Originalpr�fix speichern; in diesem Fall kann die Implementation sicherstellen, dass der zur�ckgegebene String immer der in der XML-Quelle benutzte QName ist. Falls die �bergebene Knotenmenge leer ist oder der erste Knoten keinen erweiterten Namen besitzt, wird eine leere Zeichenkette zur�ckgegeben. Wird kein Argument �bergeben, wird stattdessen eine Knotenmenge mit dem Kontextknoten als einzigem Element benutzt.

Anmerkung: Die von der Funktion name gelieferte Zeichenkette ist die gleiche wie die von der Funktion local-name gelieferte, au�er f�r Element- und Attributknoten.

Anmerkung des �bersetzers:

F�r einen folgenderma�en definierten Elementknoten

darf die Funktion name damit die Zeichenkette �y:foo� liefern, da durch das Pr�fix y der gleiche Namensraum repr�sentiert wird wie durch x.

Die drei Funktionen local-name, namespace-uri und name werden in der folgenden Tabelle kurz zusammengefasst. Das Zeichen �-� steht dabei f�r die leere Zeichenkette:

local-name namespace-uri name
[5.1 Wurzelknoten] - - -
[5.2 Elementknoten] Name ohne Pr�fix URI des Namensraums, in dem sich das Element befindet voller Name
[5.3 Attributknoten] Name ohne Pr�fix URI des Namensraums, in dem sich das Attribut befindet voller Name
[5.4 Namensraumknoten] Namensraum-Pr�fix - Namensraum-Pr�fix
[5.5 Processing-Instruction-Knoten] Ziel - Ziel
[5.6 Kommentarknoten] - - -
[5.7 Textknoten] - - -

Diese Funktionen erwarten als Argument zwar eine Knotenmenge, werten jedoch immer nur den ersten Knoten bez�glich der Dokumentordnung aus. Der zugrunde liegende Begriff erweiterter Name wird in Kapitel [5 Datenmodell] erl�utert.

�ber den Umweg, den Namen eines Knotens auszuwerten, lassen sich Knotentests variabel beschreiben. M�chte man beispielsweise den Typ eines Nachkommenelements parametrisieren, kann man nicht descendant::$name verwenden. Mittels der Funktionen local-name und namespace-uri l�sst sich das Problem l�sen, indem zun�chst alle Nachkommenelemente in die Ausgangsknotenmenge aufgenommen und anschlie�end innerhalb eines Pr�dikats diejenigen mit dem richtigen Namen und dem richtigen Namensraum herausgefiltert werden:

descendant::*[local-name()=$lname and namespace-uri()=$uri]

F�r XML-Dokumente, die keinen Gebrauch von Namensr�umen machen, reicht bereits ein Vergleich mit der von der Funktion name gelieferten Zeichenkette.

4.2 Zeichenkettenfunktionen

Funktion: string string(object?)

Die Funktion string konvertiert ein Objekt wie folgt in eine Zeichenkette:

Wird kein Argument �bergeben, wird stattdessen eine Knotenmenge mit dem Kontextknoten als einzigem Element benutzt.

Anmerkung: Die Funktion string ist nicht daf�r gedacht, Zahlen in Zeichenketten zu konvertieren, die an Nutzer ausgegeben werden. Die in [XSLT] definierte Funktion format-number und das ebenfalls dort definierte Element xsl:number stellen diese Funktionalit�t bereit.

Funktion: string concat(string, string, string*)

Die Funktion concat liefert die Verkettung ihrer Argumente.

Funktion: boolean starts-with(string, string)

Die Funktion starts-with liefert den logischen Wert wahr, falls die im ersten Argument �bergebene Zeichenkette mit der im zweiten Argument �bergebenen Zeichenkette beginnt, und andernfalls falsch.

Anmerkung des �bersetzers:

Gem�� Errata-Dokument [XPath Errata] muss an dieser Stelle folgender Satz erg�nzt werden:

Wenn das zweite Argument die leere Zeichenkette ist, wird der Wert wahr zur�ckgegeben.

Funktion: boolean contains(string, string)

Die Funktion contains liefert den logischen Wert wahr, falls die im ersten Argument �bergebene Zeichenkette die im zweiten Argument �bergebene Zeichenkette enth�lt, und andernfalls falsch.

Anmerkung des �bersetzers:

Gem�� Errata-Dokument [XPath Errata] muss an dieser Stelle folgender Satz erg�nzt werden:

Wenn das zweite Argument die leere Zeichenkette ist, wird der Wert wahr zur�ckgegeben.

Funktion: string substring-before(string, string)

Die Funktion substring-before liefert aus der im ersten Argument �bergebenen Zeichenkette die Teilzeichenkette, die vor dem ersten Auftreten der im zweiten Argument �bergebenen Zeichenkette steht, bzw. die leere Zeichenkette, falls die erste Zeichenkette nicht die zweite enth�lt. Zum Beispiel liefert substring-before("1999/04/01","/") das Ergebnis 1999.

Anmerkung des �bersetzers:

Gem�� Errata-Dokument [XPath Errata] muss an dieser Stelle folgender Satz erg�nzt werden:

Wenn das zweite Argument die leere Zeichenkette ist, wird die leere Zeichenkette zur�ckgegeben.

Funktion: string substring-after(string, string)

Die Funktion substring-after liefert aus der im ersten Argument �bergebenen Zeichenkette die Teilzeichenkette, die nach dem ersten Auftreten der im zweiten Argument �bergebenen Zeichenkette steht, bzw. die leere Zeichenkette, falls die erste Zeichenkette nicht die zweite enth�lt. Zum Beispiel liefert substring-after("1999/04/01","/") das Ergebnis 04/01 und substring-after("1999/04/01","19") liefert 99/04/01.

Anmerkung des �bersetzers:

Gem�� Errata-Dokument [XPath Errata] muss an dieser Stelle folgender Satz erg�nzt werden:

Wenn das zweite Argument die leere Zeichenkette ist, wird die im ersten Argument �bergebene Zeichenkette zur�ckgegeben.

Funktion: string substring(string, number, number?)

Die Funktion substring liefert aus der im ersten Argument �bergebenen Zeichenkette die Teilzeichenkette, die an der im zweiten Argument angegebenen Position beginnt und die im dritten Argument angegebene L�nge besitzt. Zum Beispiel liefert substring("12345",2,3) das Ergebnis "234". Falls kein drittes Argument angegeben wird, liefert die Funktion die Teilzeichenkette, die an der im zweiten Argument angegebenen Position beginnt und bis zum Ende der Zeichenkette reicht. Zum Beispiel liefert substring("12345",2) das Ergebnis "2345".

Genauer gesagt wird f�r jedes Zeichen der Zeichenkette (siehe [3.6 Zeichenketten]) eine numerische Position angenommen: die Position des ersten Zeichens ist 1, die Position des zweiten Zeichens ist 2 usw.

Anmerkung: Dies unterscheidet sich von Java und ECMAScript, in denen die Methode String.substring die Position des ersten Zeichens mit 0 definiert.

Die zur�ckgegebene Teilzeichenkette enth�lt die Zeichen, deren Position gr��er oder gleich dem gerundeten Wert des zweiten Arguments ist und, falls ein drittes Argument �bergeben wurde, kleiner als die Summe des gerundeten Wertes des zweiten und des gerundeten Wertes des dritten Arguments. Vergleich und Addition folgen den Standardregeln von IEEE 754; die Rundung erfolgt wie durch die Funktion round. Die folgenden Beispiele illustrieren einige un�bliche F�lle:

Anmerkung des �bersetzers:

Die letzten vier Beispiele werden plausibel, wenn man die Definition f�r substring wortgetreu anwendet und beachtet, dass ein Vergleich mit dem Wert NaN immer falsch sowie jede Gleitkommazahl kleiner als positiv unendlich ist.

Mit Hilfe eines �hnlich gearteten Aufrufs dieser Funktion k�nnen bedingte Ausdr�cke f�r Zeichenketten und damit auch Zahlen simuliert werden. Ein bedingter Ausdruck liefert abh�ngig von der Auswertung eines logischen Ausdrucks einen von zwei m�glichen vorgegebenen Werten. F�r Knotenmengen wurde die analoge Funktionalit�t im Zusammenhang mit dem Vereinigungsoperator | bereits in Kapitel [3.3 Knotenmengen] vorgestellt.

Unter Ausnutzung der Tatsache, dass ein logischer Wert wahr nach 1 und ein logischer Wert falsch nach 0 konvertiert wird (siehe Regeln bei der Funktion number), ergibt der Ausdruck

substring(string, 1 div boolean-test)

den Wert string, falls boolean-test wahr ist, und ansonsten die leere Zeichenkette. Die vollst�ndige Formulierung eines bedingten Ausdrucks sieht damit folgenderma�en aus:

concat(substring(true-string, 1 div boolean-test),
       substring(false-string, 1 div not(boolean-test)))

Solche Ausdr�cke k�nnen beim Sortieren in XSLT eingesetzt werden, wenn der zu benutzende Sortierschl�ssel von einer aktuell auszuwertenden Bedingung abh�ngt. Allerdings werden sie bei komplexeren Bedingungen schnell un�bersichtlich.

Funktion: number string-length(string?)

Die Funktion string-length liefert die Anzahl der Zeichen der Zeichenkette (siehe [3.6 Zeichenketten]). Falls kein Argument �bergeben wurde, wird der in eine Zeichenkette konvertierte Kontextknoten angenommen, mit anderen Worten der Zeichenkettenwert des Kontextknotens.

Anmerkung des �bersetzers:

Es gibt in XPath keine Funktion ends-with, die analog zu starts-with bestimmt, ob eine Zeichenkette mit einer anderen endet. Mit Hilfe der Funktionen substring und string-length kann diese Funktionalit�t jedoch nachgebildet werden. ends-with($str1, $str2) w�rde den Wert wahr liefern, falls gilt:

$str2 = substring($str1, string-length($str1) - string-length($str2) + 1)

F�r das Auff�llen einer Zeichenkette von links mit Leerzeichen (z.B. f�r eine rechtsb�ndige Textausgabe) erweisen sich die Funktionen concat, substring und string-length sowie eine ausreichend lange, ausschlie�lich aus Leerzeichen bestehende Zeichenkette als gute Helfer:

concat(substring("                                             ",
                 1, $width - string-length($eingabe)), $eingabe)

Funktion: string normalize-space(string?)

Die Funktion normalize-space liefert als Ergebnis die �bergebene Zeichenkette mit normalisiertem Leerraum zur�ck, d.h. f�hrender und abschlie�ender Leerraum werden entfernt, Folgen von mehreren Leerraumzeichen werden durch ein einzelnes Leerzeichen ersetzt. Leerraumzeichen sind jene, die durch die Produktion S in XML definiert sind. Falls kein Argument �bergeben wurde, wird der in eine Zeichenkette konvertierte Kontextknoten angenommen, mit anderen Worten der Zeichenkettenwert des Kontextknotens.

Anmerkung des �bersetzers:

Diese Funktion verarbeitet eine �bergebene Zeichenkette in der gleichen Weise, wie ein XML-Prozessor nach Ersetzung aller Referenzen Nicht-CDATA-Attribute behandelt, siehe Kapitel 3.3.3 in [XML, 2nd Edition].

Zur Erl�uterung sei das folgende Beispiel angegeben. H�ufig finden sich in XML-Dokumenten Textdaten, die folgenderma�en ausgezeichnet sind:


   Otto Normal

Der Zeichenkettenwert des Elements name enth�lt neben der wichtigen Information �ber Otto Normal auch alle Leerraumzeichen, also den Zeilenumbruch nach dem Start-Tag , die Leerzeichen vor Otto und den Zeilenumbruch inklusive eventueller Leerzeichen vor dem schlie�enden End-Tag. Ein Vergleich f�r den Kontextknoten name

.="Otto Normal"

liefert also nicht das erhoffte Ergebnis, sondern schl�gt fehl. Korrekt ist in diesem Fall stattdessen ein Vergleich mit dem normalisierten Wert des Knotens:

normalize-space()="Otto Normal"

Am Beispiel normalize-space soll an dieser Stelle vor einer Falle gewarnt werden, in die man bei der �bergabe von Knotenmengen an Funktionen mit skalaren Parametertypen leicht geraten kann. Angenommen, der Name Otto Normal kommt mehrfach vor und man m�chte nur den ersten dieser name-Knoten bearbeiten. In diesem Fall kann man z.B. verlangen, dass keiner der Vorg�nger den gleichen Namen hat. Ist eine Normalisierung nicht erforderlich, lautet der Test einfach:

.="Otto Normal" and not(preceding-sibling::name="Otto Normal")

Muss man aber normalisieren, erweist sich der folgende Test als ungeeignet:

normalize-space()="Otto Normal" and
not(normalize-space(preceding-sibling::name)="Otto Normal")

Da die Funktion normalize-space als Argument eine Zeichenkette erwartet, wird die �bergebene Knotenmenge mit der Funktion string konvertiert. Es wird also letztlich nur der erste Knoten (bez�glich der Dokumentordnung) der �bergebenen Knotenmenge durch normalize-space ausgewertet und damit nur getestet, ob der erste name-Knoten einen von �Otto Normal� verschiedenen normalisierten Zeichenkettenwert besitzt. Die L�sung besteht in solchen F�llen darin, den Test in ein Pr�dikat zu verschieben:

normalize-space()="Otto Normal" and
not(preceding-sibling::name[normalize-space()="Otto Normal"])

Funktion: string translate(string, string, string)

Die Funktion translate liefert als Ergebnis die im ersten Argument �bergebene Zeichenkette, wobei jedes Vorkommen eines Zeichens aus der im zweiten Argument �bergebenen Zeichenkette ersetzt wird durch das Zeichen an der korrespondierenden Position aus der im dritten Argument �bergebenen Zeichenkette. Zum Beispiel liefert translate("bar","abc","ABC") die Zeichenkette BAr. Wenn es im zweiten Argument ein Zeichen gibt, f�r das kein korrespondierendes Zeichen im dritten Argument existiert (weil das zweite Argument l�nger ist als das dritte), so werden alle Vorkommen dieses Zeichens im ersten Argument entfernt. Zum Beispiel liefert translate("--aaa--","abc-","ABC") das Ergebnis "AAA". Falls ein Zeichen mehrmals im zweiten Argument vorkommt, bestimmt das erste Auftreten das Ersetzungszeichen. Falls die im dritten Argument �bergebene Zeichenkette l�nger ist als die zweite, werden �berz�hlige Zeichen ignoriert.

Anmerkung: Die Funktion translate ist keine ausreichende L�sung f�r die Umwandlung zwischen Gro�- und Kleinschreibung in allen Sprachen. Eine zuk�nftige Version von XPath kann zus�tzliche Funktionen f�r diese Umwandlung zur Verf�gung stellen.

Anmerkung des �bersetzers:

F�r deutsche Umlaute reicht sie im Allgemeinen aus. M�chte man in einem Stylesheet an mehreren Stellen Klein- in Gro�schreibung umwandeln, bietet es sich an, geeignete Variablen zu definieren und fortan diese zu benutzen.

In XSLT s�he das folgenderma�en aus:




...

   ...

Allerdings st��t man schon beim Buchstaben �߫ an die Grenzen der Funktion translate. Die Ersetzung von �߫ durch die beiden Buchstaben �SS� ist auf diese Weise nicht m�glich, weil der Ersetzungstext l�nger als ein Zeichen ist.

Allgemein gilt, dass die Funktion translate kein Mittel zum Ersetzen von beliebigen Teilzeichenketten ist. Ein einmaliges Ersetzen im Sinne von replace($string, $from, $to) kann durch

concat(substring-before($string, $from), $to,
       substring-after($string, $from))

ausgedr�ckt werden. XPath 1.0 stellt keine Mittel bereit, alle Vorkommen von $from in $string durch $to zu ersetzen. Dies wird sich in einer zuk�nftigen XPath-Version �ndern [XPath Operators 2.0].

Mit der Funktion translate lassen sich dar�ber hinaus sehr einfach ausgew�hlte Zeichen aus einer Zeichenkette entfernen, indem als drittes Argument eine leere Zeichenkette �bergeben wird. Dies kann beispielsweise f�r den Test genutzt werden, ob eine Zeichenkette $string nur die in $allowed-char aufgez�hlten Zeichen enth�lt:

translate($string, $allowed-char, "") = ""

4.3 Boolesche Funktionen

Funktion: boolean boolean(object)

Die Funktion boolean konvertiert ihr Argument wie folgt in einen Boolean-Wert:

Anmerkung des �bersetzers:

W�hrend das Argument der Funktionen string und number optional ist, beim Fehlen damit der Kontextknoten angenommen wird, ist das Argument f�r die Funktion boolean obligatorisch. Eine analoge Definition, die gegebenenfalls auf den Kontextknoten zur�ckgreift, h�tte auch nicht viel Sinn, da in diesem Fall die Funktion boolean den Wert wahr liefern m�sste – der Kontextknoten ist schlie�lich immer vorhanden.

Funktion: boolean not(boolean)

Die Funktion not liefert den Wert wahr, wenn ihr Argument falsch ist, und ansonsten falsch.

Anmerkung des �bersetzers:

Im Unterschied zu den Operatoren and und or, die in den Produktionen OrExpr bzw. AndExpr definiert werden, handelt es sich bei not um eine Funktion.

Funktion: boolean true()

Die Funktion true liefert den Wert wahr.

Funktion: boolean false()

Die Funktion false liefert den Wert falsch.

Anmerkung des �bersetzers:

XPath definiert keine Literale f�r wahr und falsch. Soll ein boolescher Wert als Parameter an eine Funktion oder ein benanntes XSLT-Template �bergeben werden, muss daf�r eine der Funktionen true oder false benutzt werden.

Funktion: boolean lang(string)

Die Funktion lang liefert einen Wert wahr oder falsch in Abh�ngigkeit davon, ob die durch xml:lang-Attribute angegebene Sprache des Kontextknotens die gleiche oder eine Untersprache der im Argument �bergebenen Zeichenkette ist. Die Sprache des Kontextknotens wird durch den Wert des Attributes xml:lang des Kontextknotens bestimmt oder, wenn der Kontextknoten kein Attribut xml:lang besitzt, durch den Wert des Attributes xml:lang beim n�chsten Vorfahren des Kontextknotens, der ein Attribut xml:lang besitzt. Wenn es kein solches Attribut gibt, liefert lang den Wert falsch. Wenn es ein solches Attribut gibt, liefert lang den Wert wahr, wenn der Attributwert gleich dem Argument ist, unabh�ngig von der Gro�- oder Kleinschreibung, oder wenn es ein mit - beginnendes Suffix derart gibt, dass der Attributwert gleich dem Argument ohne dieses Suffix ist, unabh�ngig von der Gro�- oder Kleinschreibung. Beispielsweise w�rde lang("en") den Wert wahr liefern, wenn es sich beim Kontextknoten um eines dieser f�nf Elemente handelt:


Anmerkung des �bersetzers:

Handelt es sich beim Kontextknoten dagegen um das para-Element im Beispiel

liefert lang("en") den Wert falsch. Der n�chste Vorfahre mit einem xml:lang-Attribut ist in diesem Fall das Element sect, in welchem die Sprache auf de gesetzt wird.

Das Verhalten der Funktion lang darf nicht mit einem impliziten Vorhandensein des Attributs xml:lang verwechselt werden. F�r das obige Beispiel liefert //para[@xml:lang='de'] eine leere Knotenmenge, w�hrend //para[lang('de')] das para-Element ausw�hlt.

4.4 Zahlenfunktionen

Funktion: number number(object?)

Die Funktion number konvertiert ihr Argument wie folgt in eine Zahl:

Wird kein Argument �bergeben, wird stattdessen eine Knotenmenge mit dem Kontextknoten als einzigem Element benutzt.

Anmerkung: Die Funktion number sollte nicht f�r die Konvertierung numerischer Daten in einem Element eines XML-Dokuments benutzt werden, es sei denn, das Element ist von einem Typ, der numerische Daten in einem sprachunabh�ngigen Format repr�sentiert (das typischerweise f�r die Pr�sentation f�r einen Anwender in ein sprachspezifisches Format umgewandelt w�rde). Dar�ber hinaus kann die Funktion number nur genutzt werden, wenn das von dem Element genutzte sprachunabh�ngige Format mit der XPath-Syntax f�r Number konsistent ist.

Anmerkung des �bersetzers:

Insbesondere eignet sich eine Zahl im hiesigen Format (der Punkt zur Kennzeichnung der Tausenderstellen, das Komma zur Abgrenzung von den Dezimalstellen) nicht als Argument f�r die Funktion number. Der Aufruf von number('12.000,50') liefert beispielsweise den Wert NaN. Eine Umwandlung in das Format f�r Number kann in diesem Fall mit Hilfe der Funktion translate vorgenommen werden: number(translate('12.000,50', ',.', '.')).

Funktion: number sum(node-set)

Die Funktion sum liefert die Summe aller in eine Zahl konvertierten Zeichenkettenwerte der Knoten aus der Argumentknotenmenge.

Anmerkung des �bersetzers:

Sie eignet sich damit nur f�r F�lle, in denen die zu summierenden Werte direkt in der XML-Quelle vorliegen. Sollen die Summanden komplexer sein, d.h. jeweils durch einen eigenen Ausdruck berechnet werden, kann die Funktion sum nicht mehr benutzt werden. XPath nutzende Implementationen k�nnen aber eigene Sprachmittel bereitstellen, mit denen solche Berechnungen durchgef�hrt werden k�nnen.

Die Funktion sum hilft noch in einem anderen Anwendungsfall: Aus der Definition des Verhaltens von number geht hervor, dass letztere eine leere Knotenmenge in den Wert NaN konvertiert. Ein Ausdruck foo - bar liefert damit NaN, falls wenigstens eines der Elemente foo oder bar nicht existiert. M�chte man stattdessen, dass in diesem Fall die Zahl 0 f�r nicht existierende Elemente angenommen wird, kann man dies �ber den Ausdruck sum(foo[1]) - sum(bar[1]) erreichen.

Funktion: number floor(number)

Die Funktion floor liefert die gr��te Zahl (die am n�chsten an positiv unendlich liegt), die nicht gr��er als das Argument und ganzzahlig ist.

Anmerkung des �bersetzers:

Gem�� Errata-Dokument [XPath Errata] muss an dieser Stelle folgender Absatz erg�nzt werden:

Wenn das Argument NaN ist, wird NaN zur�ckgegeben. Wenn das Argument positiv unendlich ist, wird positiv unendlich zur�ckgegeben. Wenn das Argument negativ unendlich ist, wird negativ unendlich zur�ckgegeben. Wenn das Argument positiv Null ist, wird positiv Null zur�ckgegeben. Wenn das Argument negativ Null ist, wird negativ Null zur�ckgegeben. Wenn das Argument gr��er als Null, aber kleiner als 1 ist, wird positiv Null zur�ckgegeben.

Funktion: number ceiling(number)

Die Funktion ceiling liefert die kleinste Zahl (die am n�chsten an negativ unendlich liegt), die nicht kleiner als das Argument und ganzzahlig ist.

Anmerkung des �bersetzers:

Gem�� Errata-Dokument [XPath Errata] muss an dieser Stelle folgender Absatz erg�nzt werden:

Wenn das Argument NaN ist, wird NaN zur�ckgegeben. Wenn das Argument positiv unendlich ist, wird positiv unendlich zur�ckgegeben. Wenn das Argument negativ unendlich ist, wird negativ unendlich zur�ckgegeben. Wenn das Argument positiv Null ist, wird positiv Null zur�ckgegeben. Wenn das Argument negativ Null ist, wird negativ Null zur�ckgegeben. Wenn das Argument kleiner als Null, aber gr��er als -1 ist, wird positiv Null zur�ckgegeben.

Funktion: number round(number)

Die Funktion round liefert die Zahl, die am n�chsten am Argument liegt und die ganzzahlig ist. Wenn es zwei solche Zahlen gibt, wird die Zahl geliefert, die n�her an positiv unendlich liegt. Ist das Argument NaN, wird NaN zur�ckgegeben. Ist das Argument positiv unendlich, wird positiv unendlich zur�ckgegeben. Ist das Argument negativ unendlich, wird negativ unendlich zur�ckgegeben. Ist das Argument positiv Null, wird positiv Null zur�ckgegeben. Ist das Argument negativ Null, wird negativ Null zur�ckgegeben. Ist das Argument kleiner als Null, aber gr��er oder gleich -0.5, wird negativ Null zur�ckgegeben.

Anmerkung: In den letzten beiden F�llen ist das Ergebnis des Aufrufs der Funktion round verschieden von der Addition von 0.5 und dem Aufruf der Funktion floor.

Anmerkung des �bersetzers:

Davon kann man sich leicht selbst �berzeugen:

F�r -0 ergibt sich: floor(-0 + 0.5) = floor(0.5) = 0 (positiv Null)

F�r -0.5 ergibt sich: floor(-0.5 + 0.5) = floor(0) = 0 (positiv Null)

5 Datenmodell

XPath operiert auf der Baumrepr�sentation eines XML-Dokuments. Das folgende Kapitel beschreibt, wie XPath ein XML-Dokument als Baum modelliert. Dieses Modell ist rein konzeptionell und schreibt keinerlei spezielle Implementation vor. Die Beziehung zwischen diesem Modell und der XML-Informationsmenge [XML Infoset] wird in [B Abbildung auf die XML-Informationsmenge] beschrieben.

Die durch XPath verarbeiteten XML-Dokumente m�ssen sich nach der XML-Namensraum-Empfehlung [XML Names] richten.

Anmerkung des �bersetzers:

Insbesondere d�rfen Namen von Elementen und Attributen das Zeichen �:� nur als Separator zwischen Namensraum-Pr�fix und lokalem Namen enthalten. Au�erdem muss jedes benutzte Pr�fix deklariert worden sein. XML-Dokumente, die den Doppelpunkt nicht Namensraum-konform verwenden, k�nnen durch XPath-Implementationen nicht verarbeitet werden.

Der Baum enth�lt Knoten. Es gibt sieben Typen von Knoten:

F�r jeden Knotentyp gibt es einen Weg, den Zeichenkettenwert eines Knotens dieses Typs zu bestimmen. Bei einigen Knotentypen ist der Zeichenkettenwert Teil des Knotens, bei anderen Knotentypen wird der Zeichenkettenwert aus den Zeichenkettenwerten der Nachkommen berechnet.

Anmerkung: F�r Element- und Wurzelknoten ist der Zeichenkettenwert eines Knotens verschieden von der Zeichenkette, die von der DOM-Methode nodeValue zur�ckgegeben wird (siehe [DOM]).

Einige Knotentypen besitzen au�erdem einen erweiterten Namen – ein Paar bestehend aus einem lokalen Teil und einem Namensraum-URI. Der lokale Teil ist eine Zeichenkette. Der Namensraum-URI ist entweder leer oder eine Zeichenkette. Der im XML-Dokument spezifizierte Namensraum-URI kann eine URI-Referenz sein, wie sie in [RFC2396] definiert ist; das bedeutet, sie kann einen Fragment-Bezeichner besitzen und sie kann relativ sein. Ein relativer URI sollte als absoluter URI w�hrend der Namensraum-Verarbeitung aufgel�st werden: Die Namensraum-URIs der erweiterten Namen von Knoten im Datenmodell sollten absolut sein. Zwei erweiterte Namen sind gleich, wenn sie den gleichen lokalen Teil haben und wenn beide einen leeren Namensraum-URI oder beide die gleichen, nichtleeren Namensraum-URIs besitzen.

Anmerkung des �bersetzers:

Nach einer Entscheidung des W3C-XML-Plenums ist die Behandlung relativer Namensraum-URIs implementationsabh�ngig. Gem�� Errata-Dokument [XPath Errata] m�ssen deshalb aus dem obigen Abschnitt die S�tze "Der im XML-Dokument spezifizierte Namensraum-URI kann eine URI-Referenz sein, wie sie in [RFC2396] definiert ist; das bedeutet, sie kann einen Fragment-Bezeichner besitzen und sie kann relativ sein. Ein relativer URI sollte als absoluter URI w�hrend der Namensraum-Verarbeitung aufgel�st werden: Die Namensraum-URIs der erweiterten Namen von Knoten im Datenmodell sollten absolut sein." ersetzt werden durch:

Ein in einer Namensraumdeklaration spezifizierter Namensraum-Name in einem XML-Dokument ist eine URI-Referenz, wie sie in [RFC2396] definiert ist; das bedeutet, sie kann einen Fragment-Bezeichner besitzen und sie kann relativ sein. Die Namensraum-URI-Komponente eines erweiterten Namens ist implementationsabh�ngig, wenn der erweiterte Name aus einem QName expandiert wird, dessen Pr�fix durch eine Namensraumdeklaration mit einem relativen URI (mit oder ohne Fragment-Bezeichner) als Namensraum-Namen deklariert wurde. Ein XPath-Ausdruck, der vom Wert der Namensraum-URI-Komponente eines solchen erweiterten Namens abh�ngt, ist nicht interoperabel.

Relative URIs der Form �host.example.org/namespace� (fehlendes Schema), �home/schema� (fehlende Host-Angabe), �http://www.w3.org/1999/../2001/XMLSchema� (mit speziellen Pfadkomponenten) oder �http://www.schema.org/address#one� (mit Fragment-Bezeichner) sollten damit vermieden werden.

Es existiert eine Ordnung, die Dokumentordnung, die f�r alle Knoten im Dokument definiert ist und die zu der Ordnung korrespondiert, in der die ersten Zeichen der XML-Repr�sentation aller Knoten in der XML-Repr�sentation des Dokuments nach der Expandierung allgemeiner Entities stehen. Der Wurzelknoten ist demzufolge der erste Knoten. Elementknoten stehen vor ihren Kindern. Das bedeutet, die Dokumentordnung ordnet Elementknoten in der Reihenfolge ihrer Start-Tags im XML-Dokument (nach der Expandierung von Entities). Attribut- und Namensraumknoten eines Elements kommen vor den Kindern des Elements. Namensraumknoten erscheinen per Definition vor den Attributknoten. Die relative Ordnung innerhalb der Namensraumknoten ist implementationsabh�ngig. Die relative Ordnung innerhalb der Attributknoten ist implementationsabh�ngig. Die umgekehrte Dokumentordnung ist die Umkehrung der Dokumentordnung.

Anmerkung des �bersetzers:

Damit ist f�r Attribut- und Namensraumknoten die Reihenfolge der Repr�sentation im XML-Dokument unerheblich.

Man darf an dieser Stelle nicht vergessen, dass die Elemente einer Knotenmenge trotzdem immer ungeordnet sind. Die Eigenschaft, die Knoten einer Menge in einer bestimmten Reihenfolge zu betrachten, geh�rt immer zu einer Operation oder Funktion, die auf dieser Menge ausgef�hrt wird. So konvertieren die Funktionen string, boolean und number bei einer gegebenen Knotenmenge immer den ersten Knoten bez�glich der Dokumentordnung. Entsprechend legen auf Ausdr�cke angewandte Pr�dikate immer die Dokumentordnung zugrunde. Demgegen�ber legt innerhalb eines Lokalisierungsschrittes immer die jeweilige Achse die f�r die dazugeh�renden Pr�dikate relevante Ordnung fest. Nachdem eine Knotenmenge konstruiert wurde, ist sie (wieder) ungeordnet. Siehe dazu auch die entsprechende Anmerkung in Kapitel [3.3 Knotenmengen].

Wurzel- und Elementknoten besitzen eine geordnete Liste von Kindknoten. Mehrere Knoten haben niemals gemeinsame Kinder: Wenn ein Knoten von einem anderen Knoten verschieden ist, dann ist kein Kindknoten des einen Knotens mit einem der Kindknoten des anderen Knotens identisch. Jeder Knoten mit Ausnahme des Wurzelknotens besitzt genau einen Elternknoten, wobei dieser entweder ein Elementknoten oder der Wurzelknoten ist. Ein Wurzel- oder ein Elementknoten ist der Elternknoten jedes seiner Kindknoten. Die Nachkommen eines Knotens sind die Kinder des Knotens sowie die Nachkommen der Kinder des Knotens.

Anmerkung des �bersetzers:

Die Bezeichnungen Eltern- und Kindknoten sind vielleicht nicht ganz gl�cklich. Jeder Knoten besitzt n�mlich maximal einen Elternknoten. Daneben sind Attribut- und Namensraumknoten vergleichbar mit rebellierenden Teenagern, die im XPath-Datenmodell nicht als Kinder ihrer Element-Elternknoten betrachtet werden.

5.1 Wurzelknoten

Der Wurzelknoten ist die Wurzel des Baumes. Ein Wurzelknoten kommt nur als Wurzel des Baumes vor. Der Elementknoten f�r das Dokumentelement ist ein Kind des Wurzelknotens. Der Wurzelknoten hat als Kinder ebenfalls Processing-Instruction-Knoten und Kommentarknoten f�r Processing Instructions und Kommentare, die im Prolog oder hinter dem Ende des Dokumentelements auftreten.

Anmerkung des �bersetzers:

Die Dokumenttyp-Deklaration ist kein Kind des Wurzelknotens. Sie kommt als solche an keiner Stelle im XPath-Datenmodell vor. So kann ein XSLT-Stylesheet keine Kopie der Dokumenttyp-Deklaration erzeugen. Ebenso werden innerhalb der Dokumenttyp-Deklaration auftretende Kommentare oder Processing Instructions nicht durch XPath-Knoten repr�sentiert.

Der Zeichenkettenwert des Wurzelknotens ergibt sich aus der Verkettung der Zeichenkettenwerte aller Textknoten in Dokumentordnung, die Nachkommen des Wurzelknotens sind.

Anmerkung des �bersetzers:

Da au�erhalb des Dokumentelements keine Textknoten auftreten d�rfen, gilt also

string(/) = string(/*)

oder mit anderen Worten: Der Wurzelknoten und sein (einziger) Element-Kindknoten besitzen den gleichen Zeichenkettenwert. Diesen erh�lt man auch, wenn aus dem Eingabedokument jegliches Markup entfernt und nur die Zeichendaten behalten werden.

Zum Vergleich: Im Document Object Model [DOM] ist der Wert des vergleichbaren Attributs nodeValue f�r ein Document-Objekt dagegen die leere Zeichenkette.

Der Wurzelknoten hat keinen erweiterten Namen.

Anmerkung des �bersetzers:

Das bedeutet, dass die Funktionen name, local-name und namespace-uri als Ergebnis die leere Zeichenkette liefern. Das in DOM definierte Attribut nodeName besitzt dagegen f�r das Document-Objekt als Wert die Zeichenkette �#document�.

5.2 Elementknoten

F�r jedes Element im Dokument gibt es einen Elementknoten. Ein Elementknoten besitzt einen erweiterten Namen, der sich durch Expandierung des im Tag des Elements spezifizierten QName in �bereinstimmung mit der XML-Namensraum-Empfehlung [XML Names] ergibt. Der Namensraum-URI des erweiterten Namens des Elements ist leer, wenn der QName kein Pr�fix enth�lt und es keinen anwendbaren voreingestellten Namensraum gibt.

Anmerkung: In der im Anhang A.3 von [XML Names] verwendeten Notation entspricht der lokale Teil des erweiterten Namens dem Attribut type des Elements ExpEType; der Namensraum-URI des erweiterten Namens entspricht dem Attribut ns des Elements ExpEType und ist leer, wenn das Attribut ns des Elements ExpEType weggelassen wurde.

Die Kinder eines Elementknotens sind die enthaltenen Elementknoten, Kommentarknoten, Processing-Instruction-Knoten und Textknoten. Entity-Referenzen zu internen und externen Entities werden expandiert. Zeichenreferenzen werden aufgel�st.

Der Zeichenkettenwert eines Elementknotens ergibt sich aus der Verkettung der Zeichenkettenwerte aller Textknoten, die Nachkommen des Elementknotens in Dokumentordnung sind.

Anmerkung des �bersetzers:

Damit gilt, dass der Zeichenkettenwert eines Elementknotens genauso als Verkettung der Zeichenkettenwerte seiner Element- und Textkinder in Dokumentordnung aufgefasst werden kann.

Zum Vergleich: Im Document Object Model [DOM] ist dagegen der Wert des vergleichbaren Attributs nodeValue f�r ein Element-Objekt die leere Zeichenkette.

5.2.1 Eindeutige IDs

Ein Elementknoten kann einen eindeutigen Bezeichner (ID) besitzen. Dies ist der Wert des Attributes, das in der DTD mit dem Typ ID deklariert wurde. Keine zwei Elemente in einem Dokument d�rfen den gleichen eindeutigen Bezeichner besitzen. Falls ein XML-Prozessor zwei Elemente in einem Dokument mit dem gleichen eindeutigen Bezeichner meldet (was nur m�glich ist, wenn das Dokument ung�ltig ist), dann muss das zweite Element in Dokumentordnung so behandelt werden, als habe es keinen eindeutigen Bezeichner.

Anmerkung: Wenn ein Dokument keine DTD besitzt, dann hat kein Element des Dokuments einen eindeutigen Bezeichner.

Anmerkung des �bersetzers:

F�r zwei oder mehr Elemente mit dem gleichen eindeutigen Bezeichner liefert die Funktion id nur den ersten Elementknoten in Dokumentordnung zur�ck. Da die Eigenschaft eines Attributes, eindeutiger Bezeichner zu sein, in der DTD deklariert wird, kann ohne DTD dieses Attribut nicht mehr erkannt werden. Das bedeutet, dass die Funktion id nach dem Entfernen der DTD aus dem Eingabedokument f�r jedes Argument nur noch die leere Knotenmenge liefert. Dies ist einer der wenigen F�lle, in denen die Existenz einer DTD sich auf die Auswertung eines XPath-Ausdrucks auswirkt.

5.3 Attributknoten

Jedes Element besitzt eine mit ihm verbundene Menge von Attributknoten; das Element ist der Elternknoten jedes dieser Attributknoten. Allerdings ist ein Attributknoten kein Kind seines Elternknotens.

Anmerkung: Dies unterscheidet sich vom DOM, welches ein Element nicht als Elternknoten seiner Attribute behandelt (siehe [DOM]).

Mehrere Elemente haben niemals gemeinsame Attributknoten: Wenn ein Elementknoten verschieden von einem anderen Elementknoten ist, dann ist kein Attributknoten des einen Elementknotens mit einem der Attributknoten eines anderen Elementknotens identisch.

Anmerkung: Der Operator = testet, ob zwei Knoten den gleichen Wert haben, nicht ob es dieselben Knoten sind. Vergleicht man die Attribute von zwei verschiedenen Elementen mittels =, so kann sich Gleichheit ergeben, obwohl diese nicht dieselben Knoten sind.

Anmerkung des �bersetzers:

Wert bedeutet hier wieder Zeichenkettenwert. Tats�chlich gilt die obige Anmerkung f�r alle Knoten, nicht nur f�r Attribute. Um die Identit�t zweier Knoten zu �berpr�fen, kann man sich beispielsweise der in Kapitel [3.3 Knotenmengen] im Zusammenhang mit dem Operator | vorgestellten Technik bedienen.

Ein vorgegebenes Attribut wird genauso behandelt wie ein spezifiziertes Attribut. Falls f�r einen Elementtyp ein Attribut in der DTD deklariert wurde, der Vorgabewert jedoch als #IMPLIED deklariert und das Attribut f�r das Element nicht angegeben wurde, so enth�lt die Attributmenge des Elements keinen Knoten f�r dieses Attribut.

Anmerkung des �bersetzers:

Beispiel:



]>

In diesem Fall besitzt der einzige Elementknoten see im XPath-Datenmodell genau einen Attributknoten namens access mit dem Wert public. Im Gegensatz zu ref handelt es sich bei access um ein vorgegebenes Attribut.

Das XPath-Datenmodell liefert keinerlei Informationen dar�ber, ob ein solches Attribut im Start-Tag eines Elements spezifiziert wurde oder nicht. Im zweiten Fall �ndert sich im Falle des Entfernens der DTD die Baumrepr�sentation des XML-Dokuments, da alle vorgegebenen, aber nicht spezifizierten Attribute wegfallen.

Einige Attribute, wie xml:lang und xml:space, besitzen die Semantik, dass sie f�r alle Elemente gelten, die Nachkommen des Elements sind, das das Attribut tr�gt, es sei denn, sie wurden in einer Instanz eines Nachkommenelements durch das gleiche Attribut �berschrieben. Das wirkt sich allerdings nicht darauf aus, wo Attributknoten im Baum vorkommen: Ein Element besitzt nur Attributknoten f�r die Attribute, die explizit im Start-Tag oder Leeres-Element-Tag dieses Elements angegeben wurden oder die in der DTD explizit mit einem Vorgabewert deklariert wurden.

Anmerkung des �bersetzers:

Im Zusammenhang mit der Funktion lang wurde auf diese Eigenschaft bereits hingewiesen. Ein Attribut xml:lang wirkt sich zwar semantisch auf die Nachkommen aus, allerdings erscheint es nicht implizit als Attributknoten bei diesen Nachkommen.

Damit liefert z.B. //*[lang('de')] in der Regel eine andere Knotenmenge als //*[@xml:lang='de']. Im ersten Ausdruck werden alle die Knoten ausgew�hlt, f�r die selbst oder f�r deren n�chsten Vorfahren die Sprache Deutsch (de) festgelegt wurde. Der zweite Ausdruck w�hlt dagegen nur die Knoten aus, die ein Attribut xml:lang explizit oder als Vorgabewert mit dem Wert de besitzen. Abgesehen davon w�rde die zweite Variante auch Attribute wie xml:lang="DE-CH" unber�cksichtigt lassen.

Ein Attributknoten hat einen erweiterten Namen und einen Zeichenkettenwert. Der erweiterte Name wird durch Expandierung des im Tag im XML-Dokument angegebenen QName in �bereinstimmung mit der XML-Namensraum-Empfehlung [XML Names] berechnet. Der Namensraum-URI des Attributnamens ist leer, falls der QName des Attributs kein Pr�fix enth�lt.

Anmerkung des �bersetzers:

Entsprechend der XML-Namensraum-Empfehlung [XML Names] wirkt sich somit ein voreingestellter Namensraum im Gegensatz zu Elementknoten nicht auf Attribute ohne Pr�fix aus.

Anmerkung: In der im Anhang A.3 von [XML Names] verwendeten Notation entspricht der lokale Teil des erweiterten Namens dem Attribut name des Elements ExpAName; der Namensraum-URI des erweiterten Namens entspricht dem Attribut ns des Elements ExpAName und ist leer, wenn das Attribut ns des Elements ExpAName weggelassen wurde.

Ein Attributknoten besitzt einen Zeichenkettenwert. Dieser Zeichenkettenwert ist der durch die XML-Empfehlung [XML] spezifizierte normalisierte Wert. Ein Attribut, dessen normalisierter Wert eine Zeichenkette der L�nge null ist, wird nicht gesondert behandelt: Es resultiert in einem Attributknoten, dessen Zeichenkettenwert eine Zeichenkette der L�nge null ist.

Anmerkung des �bersetzers:

Normalisierung bedeutet, dass alle Entity- und Zeichenreferenzen aufgel�st sowie alle Leerraumzeichen durch die gleiche Anzahl Leerzeichen ersetzt werden. Ist der Attributtyp nicht CDATA, wird der Attributwert dar�ber hinaus wie bei der Anwendung der Funktion normalize-space umgewandelt.

Anmerkung: Es ist m�glich, dass Attribute mit Vorgabewerten in einer externen DTD oder einem externen Parameter-Entity deklariert werden. Die XML-Empfehlung verlangt nicht, dass ein XML-Prozessor eine externe DTD oder ein externes Parameter-Entity einliest, es sei denn, dieser ist validierend. Ein Stylesheet oder ein anderes Werkzeug, das annimmt, der XPath-Baum enthalte in einer externen DTD oder einem externen Parameter-Entity deklarierte Vorgabewerte, kann m�glicherweise mit nicht-validierenden XML-Prozessoren nicht funktionieren.

Es gibt keine Attributknoten zu Attributen, die Namensr�ume deklarieren (siehe [XML Names]).

Anmerkung des �bersetzers:

Attribute mit dem Namen �xmlns� oder dem Pr�fix �xmlns� werden nicht als Attributknoten, sondern als Namensraumknoten im Datenmodell repr�sentiert.

5.4 Namensraumknoten

Jedem Element ist eine Menge von Namensraumknoten zugeordnet, einer f�r jedes einzelne Namensraum-Pr�fix, das f�r das Element g�ltig ist (einschlie�lich des Pr�fixes xml, das implizit durch die XML-Namensraum-Empfehlung deklariert wird) und einer f�r den voreingestellten Namensraum, falls einer f�r das Element g�ltig ist. Das Element ist der Elternknoten jedes dieser Namensraumknoten; ein Namensraumknoten ist allerdings kein Kind seines Elternelements. Mehrere Elemente haben niemals gemeinsame Namensraumknoten: Wenn ein Elementknoten verschieden von einem anderen Elementknoten ist, dann ist kein Namensraumknoten des einen Elementknotens mit einem der Namensraumknoten eines anderen Elementknotens identisch. Das bedeutet, ein Element besitzt einen Namensraumknoten:

Anmerkung des �bersetzers:

Namensraumdeklarationen wirken sich damit in der Regel auf die Nachkommen des Elements aus, in dem diese Deklaration erscheint. Im Gegensatz zu den Attributen xml:lang und xml:space werden Namensraumknoten jedoch tats�chlich an die Nachkommen vererbt. Jeder Elementknoten besitzt ein eigenes Knoten-Exemplar f�r jeden g�ltigen Namensraum.

Wie bereits in Kapitel [1 Einleitung] an einem Beispiel verdeutlicht wurde, folgt aus der Namensraum-Empfehlung, dass jedes Element wenigstens einen Namensraumknoten mit dem Pr�fix xml und dem Namensraum-URI http://www.w3.org/XML/1998/namespace besitzt.

Da das XPath-Datenmodell keine Informationen dar�ber enth�lt, an welchen Stellen Namensraumdeklarationen im Dokument auftreten, besitzen die Beispiele

und

die gleiche Baumrepr�sentation.

Ein Namensraumknoten besitzt einen erweiterten Namen: Der lokale Teil ist das Namensraum-Pr�fix (dieses ist leer, falls der Namensraumknoten den voreingestellten Namensraum repr�sentiert); der Namensraum-URI ist immer leer.

Der Zeichenkettenwert eines Namensraumknotens ist der Namensraum-URI, der an das Namensraum-Pr�fix gebunden ist. Wenn dieser relativ ist, muss er wie ein Namensraum-URI in einem erweiterten Namen aufgel�st werden.

Anmerkung des �bersetzers:

Nach einer Entscheidung des W3C-XML-Plenums ist die Behandlung relativer Namensraum-URIs implementationsabh�ngig. Gem�� Errata-Dokument [XPath Errata] muss dieser letzte Absatz durch den folgenden ersetzt werden:

Der Zeichenkettenwert eines Namensraumknotens ist der Namensraum-URI, der an das Namensraum-Pr�fix gebunden ist; wenn der in der Namensraumdeklaration auftretende Namensraum-Name ein relativer URI (mit oder ohne Fragment-Bezeichner) ist, so ist der Zeichenkettenwert implementationsabh�ngig. Ein XPath-Ausdruck, der vom Zeichenkettenwert eines solchen Namensraumknotens abh�ngt, ist nicht interoperabel.

Die Definition des erweiterten Namens f�r Namensraumknoten mag auf den ersten Blick etwas ungew�hnlich erscheinen. Tats�chlich wurde hier das Namensraum-Pr�fix als eigentlich relevanter Namensbestandteil dem Schema f�r erweiterte Namen angepasst, den jeder Knoten besitzt. Der Namensraum-URI des Namens ist leer, da der Name eines Namensraumknotens nicht von anderen g�ltigen Namensraumdeklarationen abh�ngt.

Zur Illustration zwei Beispiele: Die Deklaration xmlns:prefix="urn:eindeutiger-bezeichner" erzeugt einen Namensraumknoten, dessen erweiterter Name gleich [�prefix�, ��] ist. Eine Deklaration f�r den voreingestellten Namensraum xmlns="urn:eindeutiger-bezeichner" f�hrt zu einem Knoten mit dem erweiterten Namen [��, ��]. Der Zeichenkettenwert ist in beiden F�llen �urn:eindeutiger-bezeichner�. Ein Namensraumknoten hat niemals einen leeren Zeichenkettenwert.

Namensraumknoten werden ben�tigt, wenn in den Daten enthaltene qualifizierte Namen ausgewertet werden sollen. Die Typangabe in einem XML-Schema ist so ein Beispiel: type="ob:adresse". Zur Ermittlung des dazugeh�rigen Namensraum-URIs kann folgender Ausdruck verwendet werden:

string(namespace::*[name()=substring-before(../@type,':')])

Da der Namensraumknoten f�r den voreingestellten Namensraum einen leeren Namen besitzt und daher nicht direkt als Knotentest angegeben werden kann, l�sst sich ein solcher Knoten nur mit Hilfe eines geeigneten Pr�dikats ausw�hlen:

namespace::*[name()='']

5.5 Processing-Instruction-Knoten

F�r jede Processing Instruction gibt es einen Processing-Instruction-Knoten, mit Ausnahme der Processing Instructions, die innerhalb der Dokumenttyp-Deklaration erscheinen.

Eine Processing Instruction besitzt einen erweiterten Namen: Der lokale Teil ist das Ziel der Processing Instruction; der Namensraum-URI ist leer. Der Zeichenkettenwert eines Processing-Instruction-Knotens ist der Teil der Processing Instruction, der dem Ziel und allem Leerraum folgt. Dieser beinhaltet nicht das abschlie�ende ?>.

Anmerkung des �bersetzers:

Die folgende Processing Instruction

wird z.B. durch einen Knoten repr�sentiert, dessen erweiterter Name [�xml-stylesheet�, ��] und dessen Zeichenkettenwert �href='style.xsl' title='Hauptstylesheet'� ist.

Die Abschnitte, die hier wie Attribute einer Processing Instruction aussehen (href und title), sind in Wirklichkeit nur Teile des Inhalts, also des Zeichenkettenwerts. Durch XPath werden an dieser Stelle keine Attributknoten bereitgestellt. M�chte man auf diese Pseudo-Attribute zugreifen, muss man sich mit den Funktionen f�r Zeichenketten behelfen.

Namensraumdeklarationen wirken sich nicht auf Processing Instructions aus.

Anmerkung: Die XML-Deklaration ist keine Processing Instruction. Daher gibt es auch keinen Processing-Instruction-Knoten f�r die XML-Deklaration.

Anmerkung des �bersetzers:

Es ist nicht m�glich, auf die Angaben innerhalb der XML-Deklaration zuzugreifen. Die Versionsnummer und die Kodierungsangabe geh�ren nicht zum XPath-Datenmodell.

5.6 Kommentarknoten

F�r jeden Kommentar gibt es einen Kommentarknoten, mit Ausnahme der Kommentare, die innerhalb der Dokumenttyp-Deklaration erscheinen.

Der Zeichenkettenwert eines Kommentarknotens ist der Inhalt des Kommentars ohne die �ffnenden Zeichen .

Ein Kommentarknoten besitzt keinen erweiterten Namen.

Anmerkung des �bersetzers:

Das bedeutet, dass die Funktionen name, local-name und namespace-uri als Ergebnis die leere Zeichenkette liefern. Das in DOM definierte Attribut nodeName besitzt dagegen f�r ein Comment-Objekt als Wert die Zeichenkette �#comment�.

5.7 Textknoten

Zeichendaten werden in Textknoten zusammengefasst. Dabei werden so viele Zeichen wie m�glich in jedem Textknoten zusammengefasst: Ein Textknoten hat niemals als direkten Vorg�nger oder Nachfolger einen anderen Textknoten. Der Zeichenkettenwert eines Textknotens besteht aus den Zeichendaten. Ein Textknoten enth�lt immer wenigstens ein Zeichen.

Jedes Zeichen innerhalb eines CDATA-Abschnittes wird wie Zeichendaten behandelt. So wird im Quelldokument genauso behandelt wie <. Beides ergibt das einzelne Zeichen < in einem Textknoten innerhalb des Baumes. Ein CDATA-Abschnitt wird damit so behandelt, als w�rden und ]]> entfernt und jedes Vorkommen von < und & durch < bzw. & ersetzt werden.

Anmerkung des �bersetzers:

Das XPath-Datenmodell enth�lt also keinerlei Informationen dar�ber, in welcher Form ein Zeichen innerhalb des XML-Dokuments repr�sentiert war. Die folgenden Textinhalte des Elements x werden alle auf den gleichen Textknoten mit dem Inhalt �A� abgebildet:

A

A
A

Entsprechend w�rde beispielsweise der Inhalt des folgenden Elements para in einem einzigen Textknoten zusammengefasst werden. Der Beginn des CDATA-Abschnittes kann in XPath nicht bestimmt werden. Das Document Object Model [DOM] sieht hier stattdessen spezielle Objekte Text und CDATASection vor.


   Hier folgen Beispiel & Erkl�rung:
    10 and a < 20]]> bedeutet ...

Einzelne Zeichendaten werden innerhalb des Datenmodells nicht separat repr�sentiert. Zur Verarbeitung muss deshalb auf die bereitgestellten Zeichenkettenfunktionen zur�ckgegriffen werden.

Anmerkung: Wird ein Textknoten, der das Zeichen < enth�lt, als XML ausgegeben, so muss das Zeichen < gesch�tzt werden, beispielsweise durch < oder durch Einschluss in einen CDATA-Abschnitt.

Zeichen innerhalb von Kommentaren, Processing Instructions und Attributwerten erzeugen keine Textknoten. Zeilenenden in externen Entities werden zu #xA normalisiert, so wie in der XML-Empfehlung [XML] spezifiziert.

Anmerkung des �bersetzers:

Gem�� Errata-Dokument [XPath Errata] muss an dieser Stelle folgender Satz eingef�gt werden:

Leerraum au�erhalb des Dokumentelements erzeugt keine Textknoten.

Genau genommen l�sst sich durch XPath nicht beeinflussen, ob Leerraum generell Textknoten erzeugen soll. Abh�ngig von der Applikation, die XPath verwendet, werden f�r ausschlie�lich aus Leerraum bestehende Bereiche Textknoten angelegt oder nicht. Die Illustration zum Beispiel in Kapitel [1 Einleitung] beruht auf der Annahme, dass solche Leerraum-Textknoten vorhanden sind. Das ist auch das Standardverhalten in XSLT [XSLT] f�r zu verarbeitende XML-Dokumente. Durch Verwendung der XSLT-Elemente xsl:strip-space und xsl:preserve-space l�sst sich dieses Verhalten allerdings beeinflussen. Dar�ber hinaus werden Leerraum-Textknoten, die als Kind eines Elements mit xml:space="preserve" (siehe [XML, 2nd Edition]) auftreten, niemals entfernt.

Die Existenz solcher Leerraum-Textknoten kann sich auf Kontextgr��e und -position und damit auf das Ergebnis der Funktionen last, position und count auswirken. Die Berechnung des Ausdrucks name/text()[1] f�r das folgende Beispiel h�ngt entscheidend davon ab, ob Leerraum-Textknoten mitgez�hlt werden oder nicht:


   Herr M�ller-L�denscheidt

Ein Textknoten besitzt keinen erweiterten Namen.

Anmerkung des �bersetzers:

Das bedeutet, dass die Funktionen name, local-name und namespace-uri als Ergebnis die leere Zeichenkette liefern. Das in DOM definierte Attribut nodeName besitzt dagegen f�r Text-Objekte als Wert die Zeichenkette �#text� und f�r CDATASection-Objekte den Wert �#cdata-section�.

6 Konformit�t

XPath ist in erster Linie als Komponente gedacht, die von anderen Spezifikationen genutzt werden kann. Demzufolge �berl�sst es XPath den Spezifikationen, die XPath nutzen (etwa [XPointer] und [XSLT]), Kriterien f�r die Konformit�t von XPath zu spezifizieren und definiert selbst keinerlei Konformit�tskriterien f�r unabh�ngige XPath-Implementationen.

Anmerkung des �bersetzers:

Die Organisation Oasis hat eine Kommission f�r die Konformit�t von XSLT- und XPath-Implementationen [XSLT-Konformit�t] gebildet, die geeignete Szenarien f�r eine Test-Suite zusammenstellt.


A Referenzen

A.1 Normative Referenzen

IEEE 754
Institute of Electrical and Electronics Engineers: IEEE Standard for Binary Floating-Point Arithmetic. ANSI/IEEE Std 754-1985.
RFC2396
T. Berners-Lee, R. Fielding und L. Masinter: Uniform Resource Identifiers (URI): Generic Syntax. IETF RFC 2396. Siehe http://www.ietf.org/rfc/rfc2396.txt.
XML
World Wide Web Consortium: Extensible Markup Language (XML) 1.0. W3C Recommendation. Siehe http://www.edition-w3c.de/TR/1998/REC-xml-19980210.
XML Names
World Wide Web Consortium: Namespaces in XML. W3C Recommendation. Siehe http://www.edition-w3c.de/TR/REC-xml-names.

A.2 Andere Referenzen

Character Model
World Wide Web Consortium: Character Model for the World Wide Web. W3C Working Draft. Siehe http://www.edition-w3c.de/TR/WD-charmod.
DOM
World Wide Web Consortium: Document Object Model (DOM) Level 1 Specification. W3C Recommendation. Siehe http://www.edition-w3c.de/TR/REC-DOM-Level-1.
JLS
J. Gosling, B. Joy und G. Steele: The Java Language Specification. Siehe http://java.sun.com/docs/books/jls/index.html.
ISO/IEC 10646
ISO (International Organization for Standardization): ISO/IEC 10646-1:1993, Information technology — Universal Multiple-Octet Coded Character Set (UCS) — Part 1: Architecture and Basic Multilingual Plane. Internationaler Standard. Siehe http://www.iso.ch/cate/d18741.html.
TEI
C.M. Sperberg-McQueen und L. Burnard: Guidelines for Electronic Text Encoding and Interchange. Siehe http://etext.virginia.edu/TEI.html.
Unicode
Unicode Consortium: The Unicode Standard. Siehe http://www.unicode.org/unicode/standard/standard.html.
XML Infoset
World Wide Web Consortium: XML Information Set. W3C Working Draft. Siehe http://www.edition-w3c.de/TR/xml-infoset.
XPointer
World Wide Web Consortium: XML Pointer Language (XPointer). W3C Working Draft. Siehe http://www.edition-w3c.de/TR/WD-xptr.
XQL
J. Robie, J. Lapp und D. Schach: XML Query Language (XQL). Siehe http://www.w3.org/TandS/QL/QL98/pp/xql.html.
XSLT
World Wide Web Consortium: XSL Transformations (XSLT). W3C Recommendation. Siehe http://www.edition-w3c.de/TR/xslt.

B Abbildung auf die XML-Informationsmenge (nicht normativ)

Die Knoten im XPath-Datenmodell lassen sich aus den durch die XML-Informationsmenge [XML Infoset] bereitgestellten Informationseinheiten wie folgt ableiten.

Anmerkung: Eine neue Version des Arbeitsentwurfs der XML-Informationsmenge, die die Version vom 17. Mai (1999, der �bersetzer) ersetzen wird, war zu der Zeit, als die Vorbereitung dieser Version der XPath-Spezifikation vollendet wurde, kurz vor der Fertigstellung. Ihre Ver�ffentlichung wurde zur gleichen Zeit oder kurz nach Ver�ffentlichung dieser Version von XPath erwartet. Die Abbildung wird f�r diese neue Version des Arbeitsentwurfs der XML-Informationsmenge angegeben. Falls die neue Version des Arbeitsentwurfs der XML-Informationsmenge noch nicht ver�ffentlicht worden sein sollte, k�nnen W3C-Mitglieder die interne Arbeitsgruppenversion http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html (nur f�r Mitglieder) einsehen.

Anmerkung des �bersetzers:

Die XML-Informationsmenge beschreibt die aus einem XML-Dokument ableitbaren Informationen auf einer abstrakten Ebene. Zu diesem Zweck wurden elf Typen, so genannte Informationseinheiten (information items) definiert. Jede dieser Informationseinheiten besitzt eine Reihe von Eigenschaften (properties). Es wurde in der XML-Informationsmenge bewusst nicht der Term "Knoten" verwendet, um Verwechslungen mit DOM- und XPath-Knoten zu vermeiden. Die im XPath-Datenmodell definierten Knotentypen beschreiben eine Teilmenge der in der XML-Informationsmenge verf�gbaren Informationen und lassen sich daher aus diesen Informationseinheiten ableiten.

Die XML-Informationsmenge ist am 24. Oktober 2001 als W3C-Empfehlung verabschiedet worden. Im Vergleich zu der hier angesprochenen Version vom Dezember 1999 haben sich einige Details ge�ndert. Die sich daraus ergebenden �nderungen bei der Abbildung des XPath-Datenmodells werden im Folgenden in den jeweiligen Anmerkungen angegeben.


Zus�tzliche Referenzen der deutschen �bersetzung

XML, 2nd Edition
World Wide Web Consortium: Extensible Markup Language (XML) 1.0 (Second Edition). W3C Recommendation. Siehe http://www.edition-w3c.de/TR/2000/REC-xml-20001006.
ISO/IEC 10646, 2nd Edition
ISO (International Organization for Standardization): ISO/IEC 10646-1:2000, Information technology — Universal Multiple-Octet Coded Character Set (UCS) — Part 1: Architecture and Basic Multilingual Plane, Edition: 2 (Monolingual). Internationaler Standard. Siehe http://www.iso.ch/cate/d29819.html.
XSLT-Konformit�t
Oasis (Organization for the Advancement of Structured Information Standards): Oasis XSLT/XPath Conformance Subcommittee. Siehe http://www.oasis-open.org/committees/xslt/.
XPath Errata
World Wide Web Consortium: XML Path Language (XPath) Version 1.0 Specification Errata. 29.09.2000. Siehe http://www.w3.org/1999/11/REC-xpath-19991116-errata.
XPath Requirements 2.0
World Wide Web Consortium: XPath Requirements Version 2.0. W3C Working Draft. Siehe http://www.edition-w3c.de/TR/xpath20req.
XPath 2.0
World Wide Web Consortium: XML Path Language (XPath) 2.0. W3C Working Draft. Siehe http://www.edition-w3c.de/TR/xpath20/.
XPath Operators 2.0
World Wide Web Consortium: XQuery 1.0 and XPath 2.0 Functions and Operators. W3C Working Draft. Siehe http://www.edition-w3c.de/TR/xquery-operators/.
XQuery
World Wide Web Consortium: XQuery: A Query Language for XML. W3C Working Draft. Siehe http://www.edition-w3c.de/TR/xquery.
XSLT 2.0
World Wide Web Consortium: XSL Transformations (XSLT) Version 2.0. W3C Working Draft. Siehe http://www.edition-w3c.de/TR/xslt20/.