Operatoren für Sequenztypen

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

Operatoren: instance of, cast as, castable as, treat as

Zur Prü­fung von Sequenztypen, zur Festlegung eines statischen Typs, zur Typumwandlung sowie zum Test auf deren Durchführbarkeit im Vorfeld bietet XPath 2.0 vier Operatorkeywords an.

Typprüfung

Operator: instance of

Die Typprüfung mit dem Booleschen Operator instance of gibt den Wert true zurück, wenn der Typ des als erster Operand übergebenen Ausdrucks dem als zweiten Operand genannten Typ entspricht. Stimmt der überprüfte Typ nicht mit dem geforderten Typ überein, so gibt der Operator den Wert false zurück.

Der im zweiten Operand genannte Typbezeichner kann optional zusätzlich einen Kardinalitätsindikator *, + oder ? erhalten und so die Zusammenset­zung einer Sequenz beschreiben.

Im folgenden Beispiel wird eine Ganzzahl gegenüber dem Typ xs:integer getestet. In diesem Fall gibt der Operator den Wert true zurück:

5 instance of xs:integer

Auch wenn der Typ, auf den getestet wird, nicht dem Typ des geprüften Items entspricht, sondern einen diesem übergeordneten Typ, so ergibt der Test true. Der real vorliegende Typ xs:integer ist durch Beschränkung (restriction) vom getesteten Typ xs:decimal abgeleitet – demzufolge ergibt folgender Test wie­derum true:

5 instance of xs:decimal

Anstelle eines konkreten Wertes kann der erste Operand auch ein beliebiger XPath-Ausdruck sein – im folgenden Fall ist es das Symbol '.' für das Kontext­­item. Dieser Beispielausdruck gibt true zurück, wenn es sich beim Kontexti­tem um einen Elementknoten handelt:

instance of element()

Rückblick auf XPath 1.0

Diese Funktionalität ist in XPath 2.0 neu eingeführt worden. Eine mit instance of vergleichbare Typüber­prüfung existiert in XPath 1.0 nicht.

Typumwandlung

Operator: cast as

Wenn es, wie es gelegentlich vorkommt, erforderlich sein sollte, einen Wert in einen bestimmten zu bezeichnenden Datentyp umzu­wandeln, so kann dies mittels des in XPath 2.0 vorgesehenen cast as-Opera­tors geschehen.

Dieser Ausdruck arbeitet mit zwei Operanden, einem Eingangswert beliebi­gen Typs und einem Zieltyp. Erzeugt wird ein neuer Wert entsprechend dem Eingabewert, jedoch vom durch den Zieltyp bezeichneten Datentyp.

Nicht jeder beliebige Eingabewert kann jedoch in einen Wert eines beliebigen anderen Typs umgewandelt werden.

Alternativ zum cast as-Operator können Konstruktorfunktionen verwen­det werden. Diese sind im Ergebnis – bei etwas einfacherer Syntax – der Typumwandlung mit cast as vollkommen gleichwertig. Jedem in XML Schema bzw. XPath definierten Typ ist eine solche Konstruktorfunktion zuge­ordnet. Diese Konstruktorfunktion nimmt ebenfalls einen Eingangswert entge­gen und erzeugt eine Kopie des Wertes mit dem ihr entsprechenden Zieltyp.

"2007-01-01" cast as xs:date

bedeutet daher dasselbe wie

xs:date("2007-01-01")

Auch folgende zwei Statements sind von der Wirkung her identisch:

($floatvalue * 0.2E-5) cast as xs:decimal

und

xs:decimal($floatvalue * 0.2E-5)

Rückblick auf XPath 1.0

Eine Typumwandlung im Sinne eines »Typecastings« existiert in XPath 1.0 nicht. In der Regel wird, sofern erforderlich, innerhalb eines Ausdrucks eine implizite Typumwandlung vorgenommen. Ansonsten kann auf die Typumwandlungsfunktionen string(), boolean() und num­ber() zurückgegriffen werden.

Prüfung auf Umwandelbarkeit in einen Zieltyp

Operator: castable as

Ist die Umwandlung in einen geforderten Zieltyp nicht möglich, bricht XPath 2.0 die Verarbeitung auf Grund eines Typfehlers ab. Um dies zu vermeiden, existiert die Möglichkeit, die Umwandelbarkeit im Vorfeld zu prüfen.

Hierzu dient der Testoperator castable as, der als Operanden ebenso wie der Operator cast as einen Eingangswert und einen Zieltyp entgegennimmt. Der Operator gibt den Booleschen Wert true zurück, wenn eine Umwandlung erfolgreich wäre, false dagegen, wenn diese fehl­schlüge.

Die Anwendung des Tests mit castable as kann also Laufzeitfehlern durch fehlgeschlagene Typumwandlungen vorbeugen:

if($x castable as mein:typ)
   then $x cast as mein:typ
else if($x castable as dein:typ)
   then $x cast as dein:typ
else $x cast as xs:string

Durch die »Absicherung« der eigentlichen Typumwandlung mit cast as mit Hilfe einer mittels castable as formulierten Bedingung, wird eine tatsächli­che Umwandlung in die speziellen Typen nur dann vorgenommen, wenn sie erfolgreich sein kann. Die alternative, im else-Zweig vorgenommene Umwandlung in einen String ist in der Regel möglich.

Rückblick auf XPath 1.0

Für die Prüfung einer möglichen Typumwand­lung im Vorfeld besteht in XPath 1.0 kein Bedarf. Ein entsprechender Test ist daher nicht vorgesehen.

Statische Typfestlegung

Operator: treat as

Wird ein XPath-Ausdruck in einer Umgebung ausge­wertet, die eine statische Typüberprüfung vornehmen kann, so kann in dieser der Ergebnistyp des Ausdrucks mittels des treat as-Operators festgelegt wer­den.

Der dynamische Typ des Ausdrucks – also der während seiner tatsächlichen Auswertung tatsächlich festgestellte Typ – wird durch treat as nicht verän­dert, vielmehr handelt es sich eher um die Feststellung (assertion) im Vorfeld, dass der Ausdruck von einem bestimmten Typ sein sollte:

$isbn-nr treat as element(*, mein:isbn)

Stellt sich bei der Auswertung heraus, dass der Ausdruck nicht dem angekün­digten Typ entspricht, so kann dies als Laufzeitfehler gewertet werden.

Rückblick auf XPath 1.0

Statische Typüberprüfung ist in XPath 1.0 nicht vorgesehen.

   

<< zurück vor >>
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