• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Typausdrücke

XQuery führt einige Ausdrücke zum Umgang mit Typen ein, die man so aus anderen Sprachen nicht kennt. Die Typumwandlung für atomare Typen (cast as) ist bereits behandelt worden. Diese kann einen Laufzeitfehler ergeben, wenn die Typumwandlung nicht erfolgreich durchgeführt werden kann. Daher gibt es den Operator castable, der lediglich prüft, ob eine Umwandlung möglich ist, ohne diese durchzuführen.

Eine Typüberprüfung und -umwandlung für komplexe Typen ist mit validate möglich. Außerdem gibt es die Operation treat, mit der zugesichert werden kann, dass ein bestimmter Typ vorhanden ist, und Operationen, mit denen abgefragt werden kann, ob ein bestimmter Typ vorliegt.

Typprüfung

XQuery erlaubt die Prüfung, ob eine Typwandlung mittels cast erfolgreich (d. h. erlaubt) wäre. Dazu gibt es den castable-Operator, der false oder true liefert, je nachdem, ob ein cast einen Typfehler erzeugen würde oder nicht.

CastableExpr::=Expr castable as AtomicType ? ?

Folgendes Beispiel verwendet konditionale Ausdrücke, um die aktuelle Belegung der Variablen $x erfolgreich in ein Datum ohne bzw. mit Zeitangaben und in einen Zeitraum in Tagen zu konvertieren. Falls alle Alternativen nicht erfolgversprechend sind, wird der Wert in eine Zeichenkette konvertiert.

if ($x castable as xs:date)
then $x cast as xs:date
else if ($x castable as xs:dateTime)
then $x cast as xs:dateTime
else if ($x castable as xdt:dayTimeDuration)
then $x cast as xdt:dayTimeDuration
else $x cast as xs:string

Die Überprüfung auf eine erfolgversprechende Typkonvertierung vor dem Aufruf eines cast-Operators ist empfehlenswert, da so bei unerwarteten Daten eine gezielte Reaktion statt eines Laufzeitfehlers gewährleistet werden kann. So wird folgender FLWOR-Ausdruck einen Laufzeitfehler produzieren, da die Konvertierung nicht durchgeführt werden kann (das Format des Strings entspricht zwar dem für xs:date geforderten, aber der Wert ist nicht zulässig):

let $x := xs:string("2004-02-31")
let $y := $x cast as xs:date
return fn:get-year-from-date($y)

 

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>