Vergleich von XPath 1.0 und XPath 2.0

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 4.)

Der Sprachumfang von XPath 2.0 ist gegenüber XPath 1.0 sehr stark gewachsen. Dies gilt für die Anzahl der eingebauten Funktionen einerseits, wie für die Möglichkeiten der Formulierung der Ausdrücke andererseits.

Gemeinsamkeiten und Unterschiede

In XPath 2.0 wird beispielsweise die Verwendung von Entscheidungen, Schleifen als Kontrollstrukturen innerhalb von XPath-Ausdrücken ermöglicht. Die Lösung bestimmter Problemstellungen ist somit gegenüber XSLT 1.0/XPath 1.0 wesentlich vereinfacht bzw. überhaupt erst möglich. Im Gegensatz zu XPath 1.0 ist XPath 2.0 jedoch keine eigenständige Sprache mehr, sondern stellt eine Teilmenge von XQuery 1.0 dar.

Seitenblick – Was ist XQuery?
XQuery 1.0 ergab sich aus den Bestrebungen, eine XML-kompatible allgemeine Abfrage­sprache für XML-Dokumente zu entwickeln, die eine mit SQL vergleichbare Funktionalität bietet. Jeder gültige Ausdruck in XPath 2.0 ist daher automatisch ein gültiger Ausdruck in XQuery 1.0 und erzeugt das gleiche Ergebnis. Der umgekehrte Fall gilt jedoch nicht, da nicht alle Möglichkeiten von XQuery in XPath nutzbar sind – von daher steht XQuery auch in XSLT nicht in vollem Umfang zur Verfügung.

Gemeinsamkeiten von XPath 1.0 und XPath 2.0

  • XPath ist eine »rein funktionale« Sprache. Ein XPath-Ausdruck kann sich daher auf beliebige Art aus anderen XPath-Ausdrücken zusammensetzen. So kann bei­spielsweise ein XPath-Ausdruck einen Funktionsaufruf enthalten, der als Argument einen weiteren XPath-Ausdruck enthält etc.
  • XPath ist »case-sensitive«. Alle Bezeichner, beispielsweise Keywords, Operator- und Funktionsnamen, müssen in exakt der festgelegten Schreibweise ver­wendet werden (üblicherweise in Kleinbuchstaben). Für alle Bezeichner werden QNames mit Namensräumen unterstützt.

Unterschiede zwischen XPath 1.0 und XPath 2.0

Ungeordnete Sets vs. geordnete Sequenzen:

  • XPath 1.0 basiert auf sogenannten Sets, d.h., ein Ausdruck erzeugt eine Zusammenstellung (Set) von Knoten. Ein solcher Set ist ungeordnet, enthält aber keine Dubletten (ein Knoten ist nicht mehrmals enthalten).
  • XPath 2.0 basiert auf Sequenzen, d.h., ein Ausdruck erzeugt eine Folge (Sequenz) von sogenannten Items, die aus Nodes oder atomaren Werten bestehen können. Eine solche Sequenz ist geordnet und darf Dubletten ent­halten (ein Knoten darf mehrmals enthalten sein).

Umgang mit Datentypen – Loose typed vs. strong typed:

  • XPath 1.0 ist nicht streng typisiert (loose typed), d.h., es findet eine automati­sche Umwandlung von Werten statt, falls diese dem geforderten Eingabetyp z.B. einer Funktion nicht entsprechen. Es gibt nur vier Typen (string, num­ber, boolean, node-set).
  • XPath 2.0 ist streng typisiert (strong typed), d.h., die Operanden von Ausdrü­cken, Funktionsargumente etc. müssen dem geforderten Typ jeweils ent­sprechen, andernfalls wird ein Typfehler gemeldet. Hierbei werden alle Datentypen aus XML Schema unterstützt. (Dementsprechend existieren in XPath 2.0 rund 45 unterscheidbare Typen.)

Unterstützung von XML Schema:

  • XPath 1.0 unterstützt keine Schema-Typen, wie sie von einem externen XML-Schema vorgegeben werden können. Lediglich Teilinformationen einer DTD (wie den Definitionen von ID-Attributen) sind nutzbar.
  • XPath 2.0 ist in der Lage, direkt mit Schema-Typen umzugehen, sofern ein ent­sprechendes Schema zugänglich ist (z.B. durch Import). Darüber hinaus kön­nen in XML Schema durch den Nutzer auch eigene Datentypen oder von Basistypen abgeleitete Typen (derived types) erstellt werden, die von XPath 2.0 verwendet werden können.

Abwärtskompatibilität XPath 2.0 zu XPath 1.0

XPath 2.0 kann in zwei verschiedenen Kompatibilitätsmodi gegenüber XPath 1.0 betrieben werden. Der jeweils verwendete Modus wird im statischen Kon­text der Auswertung in der Komponente »XPath Compatibility Mode« regist­riert.

Dieser Modus gilt global, d.h. unveränderlich für die jeweilige Laufzeit des Sty­lesheets. Er kann entweder den Wert true (Auswertung der Ausdrücke abwärtskompatibel zu XPath 1.0) oder false (Auswertung der Ausdrücke gemäß den Regeln für XPath 2.0) annehmen.

Es sind drei denkbare Fälle von Inkompatibilitäten zu unter­scheiden: 

  1. Inkompatibilität bei deaktivierter Abwärtskompatibilität (der Modus für XPath 1.0-Kompatibilität ist auf false gesetzt)
  2. Inkompatibilität in Abwesenheit eines Schemas für das Quelldokument und aktivierter Abwärtskompatibilität (der Modus für XPath 1.0-Kompatibilität ist hierbei auf true gesetzt)
  3. Inkompatibilität in Anwesenheit eines Schemas für das Quelldokument (der eingestellte Kompatibilitätsmodus kann beliebig true oder false sein)

Inkompatibilitäten bei Kompatibilitätsmodus »false«

Setzt man den Kompatibilitätsmodus auf false, wird Abwärts­kompatibilität (Ergebnisgleichheit) nicht ausdrücklich gefordert und muss deshalb nicht gewährleistet werden. Viele XPath-Ausdrücke erzeugen für diesen Fall unter XPath 2.0 und XPath 1.0 dennoch identische Ergebnisse. Aus­nahmen bei bestimmten Ausdrücken sind allerdings zu beachten. In der Regel gibt es jedoch einfache Methoden, auch in diesen Fällen ein gleiches Ergebnis zu erzielen.

Hinweis: Die Begriffe »Nodeset« (XPath 1.0) und »Nodesequenz« (XPath 2.0) können für die folgenden Beschreibungen als analog betrachtet werden.

Funktion oder Operator erwartet Argument aus einzelnem Knoten

Problem: Wird eine Funktion oder ein Operator, der als Argument einen Nodeset aus genau einem Knoten erwartet, mit einem Nodeset aus mehre­ren Knoten konfrontiert, so werden unter XPath 1.0 alle Knoten außer dem ersten verworfen und nur dieser wird ausgewertet. Für den gleichen Aus­druck gilt dies unter XPath 2.0 nicht – vielmehr wird ein Typfehler gemeldet.

Lösung: Mittels eines zusätzlich auf die Nodesequenz angewendeten nume­rischen Predicates $sequenz[1] wird auch in XPath 2.0 nur der erste Kno­ten ausgewertet. Hiermit ist Ergebnisgleichheit wieder gewährleistet.

Leerer Nodeset wird arithmetischer oder Stringfunktion übergeben

Problem: In XPath 1.0 wird – da »loose typed« – ein leerer Nodeset automa­tisch konvertiert, je nach Anforderung der Funktion in einen leeren String oder den Zahlenwert NaN. Eine solche implizite Umwandlung findet für die leere Sequenz in XPath 2.0 nicht statt.

Lösung: Mittels der Funktionen fn:string() oder fn:number() kann eine explizite Umwandlung in XPath 2.0 erzwungen werden. In XPath 1.0 ist dies zwar redundant, stört aber nicht weiter.

Inkompatibilitäten bei Kompatibilitätsmodus »true«

Auch bei Kompatibilitätsmodus auf true werden Ausdrücke in XPath 2.0 anders ausgewertet als in XPath 1.0. Die folgenden Aussagen setzen voraus, dass der Ausdruck auch in XPath 1.0 grundsätzlich gültig ist.

Leerzeichen zwischen Operator und Operand erforderlich

In XPath 1.0 muss zwischen Zahlen und einem folgenden Operator nicht zwangsläufig ein Leerzeichen eingefügt werden, wenn die Operation eindeutig bleibt. In XPath 2.0 ist ein Leerzeichen dagegen Pflicht. Beispielsweise ist der Ausdruck 10div 2 in XPath 1.0 gestattet – in XPath 2.0 muss er korrekt 10 div 2 lauten

Umwandlung von String nach Zahl

Die Regeln für die Umwandlung von Strings nach Zahlen sind unter XPath 2.0 gegenüber XPath 1.0 geändert.

In XPath 2.0 wurde, was Sonderwerte wie INF und -INF betrifft, an XML Schema angeglichen. Auch Zeichen­ketten aus Ziffern mit Vorzeichen + sowie Strings in Form wissenschaftlicher Exponentialnotation können nun in »echte« Zahlenwerte gewandelt werden.

XPath 1.0 erlaubt hingegen als Vorzeichen lediglich das vorangestellte Minus und untersagt Buchstaben innerhalb des Strings (also auch e oder E). Solche Zeichenketten werden in XPath 1.0 stets zu NaN ausgewertet.

Verbot verketteter Vergleichsoperationen in XPath 2.0

In XPath 1.0 sind verkettete Vergleiche der Form A < B < C oder A = B = C gestattet. Dies ist in XPath 2.0 nicht mehr der Fall und wird als Syntaxfehler betrachtet. Ein solcher Ausdruck kann aber (auch intern durch den Prozessor) in die Form (A < B) < C umgeschrieben werden.

Keine Namensraumachse in XPath 2.0

Die »Namespace«-Achse soll in XPath 2.0 nicht länger verwendet werden (deprecated). Es ist Implementierungen allerdings freigestellt, diese Achse zum Zweck der Abwärtskompatibilität zu XPath 1.0 weiterhin zu unterstüt­zen, jedoch ist dies nicht verpflichtend.

XPath 2.0 stellt eine Reihe von Funktionen zur Verfügung, die die Anwen­dung der Namensraumachse im Prinzip überflüssig machen: fn:name­space-from-QName(), fn:namespace-uri-for-prefix() und fn:in-scope-prefixes().

In XQuery 1.0 wird die Namensraumachse ebenfalls nicht unter­stützt.

Inkompatibilitäten bei Verwendung eines Schemas

XPath 2.0 kann Angaben zu Datentypen, die innerhalb eines Schemas vorlie­gen, auswerten und berücksichtigen. Dies ist in XPath 1.0 nicht möglich. Unter XPath 2.0 ist es daher für das Ergebnis eines Ausdrucks von Bedeutung, ob er in An- oder Abwesenheit eines Schemas ausgewertet wird. Unter XPath 1.0 spielt dies hingegen keine Rolle (dies führt dazu, dass derselbe Ausdruck bei Anwe­senheit eines Schemas in XPath 1.0 und XPath 2.0 verschiedene Ergebnisse erzeugen kann).

Ein Beispiel hierfür wäre ein Attributwert, der in einem Schema als Listentyp xs:string* definiert ist und im Rahmen eines Predicates auf einen seiner Teil­werte geprüft wird: So ergibt der Attributwert farbe="rot gelb blau" mit dem Predicate [@farbe="gelb"] getestet unter XPath 1.0 das Ergebnis false, unter XPath 2.0 (in Anwesenheit des entsprechenden Schemas!) dagegen true. Fehlt das Schema, so wird auch hier false zurückgegeben.

Ein anderes Beispiel stellen Datumswerte dar, die in XPath 2.0 den Typ xs:date besitzen (ein Schema vorausgesetzt), in XPath 1.0 jedoch nur als Strings behandelt werden können:

Für das Element <person geburtstag="1950-07-01" todestag="2000-06-03"/> ergibt der Test @geburtstag < @todestag in XPath 1.0 daher false, weil beide Operanden hierfür in Zahlen umgewandelt werden müssen und NaN ergeben. XPath 2.0 erkennt dagegen beide Werte als Datumswerte xs:date und kann den Vergleich entsprechend korrekt ausführen.

   

<< zurückvor >>
Tipp der data2type-Redaktion:
Zum Thema XPath bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn