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 Zusammensetzung 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 wiederum 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 Kontextitem. Dieser Beispielausdruck gibt true zurück, wenn es sich beim Kontextitem 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überprü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 umzuwandeln, so kann dies mittels des in XPath 2.0 vorgesehenen cast as-Operators geschehen.
Dieser Ausdruck arbeitet mit zwei Operanden, einem Eingangswert beliebigen 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 verwendet 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 zugeordnet. Diese Konstruktorfunktion nimmt ebenfalls einen Eingangswert entgegen 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 number() 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 fehlschlü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ächliche 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 Typumwandlung 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 ausgewertet, die eine statische Typüberprüfung vornehmen kann, so kann in dieser der Ergebnistyp des Ausdrucks mittels des treat as-Operators festgelegt werden.
Der dynamische Typ des Ausdrucks – also der während seiner tatsächlichen Auswertung tatsächlich festgestellte Typ – wird durch treat as nicht verändert, 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ündigten 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