Typumwandlung
Neben dem Konstruktor für jeden Typ, wie er oben eingeführt wurde, gibt es einen cast as-Operator, der dieselbe Funktion erfüllt, nämlich einen Wert eines bestimmten Typs aus einem Ausgangswert zu erzeugen:
"123" cast as xs:integer
Nicht jeder Typ kann mittels cast as oder Konstruktor in einen anderen umgewandelt werden. Für die primitiven Typen aus XML Schema bestimmt XQuery, dass xs:string in fast jeden Typ umgewandelt werden kann (wenn dessen lexikalische Repräsentation beachtet wird) und umgekehrt. Die drei numerischen Typen xs:float, xs:double und xs:decimal können ebenfalls ineinander umgewandelt werden, wenn der jeweilige Wert im Wertebereich des Zieltyps liegt. Für Werte abgeleiteter Typen (sowohl solche aus XML Schema als auch vom Benutzer definierte) erlaubt XQuery folgende Umwandlungen (vorausgesetzt, dass der Wert im Wertebereich des Zieltyps liegt):
- von einem durch Einschränkung abgeleiteten Typ auf einen (direkten oder indirekten) Ursprungstyp und auch umgekehrt,
- zwischen zwei abgeleiteten Typen, wenn die zugrunde liegenden primitiven Typen aus XML Schema ineinander umgewandelt werden können.
Typumwandlung von und nach xs:boolean
Eine Zahl (basierend auf xs:double, xs:float oder xs:decimal) kann in einen Wert vom Typ xs:boolean umgewandelt werden. Es entsteht der Wert false , wenn die Zahl 0 oder NaN (not a number) ist, sonst entsteht true. Genauso kann ein Wert des Typs xs:boolean in eine Zahl verwandelt werden (false wird zu 0, true zu 1).
Typumwandlung von xs:double auf xs:float
Wenn ein Wert des Typs xs:double in einen Wert des Typs xs:float umgewandelt wird, der ja einen kleineren Wertebereich hat, dann führt ein Ausgangswert, der über der oberen Grenze des Wertebereiches für xs:float liegt, nicht zu einem Fehler, sondern zu dem Wert +INF. Analog entsteht der Wert -INF für Werte, die kleiner sind als der kleinste Wert, der als xs:float darstellbar ist.
Typumwandlung nach xs:decimal und xs:integer
Wird ein Wert vom Typ xs:float oder xs:double nach xs:decimal gewandelt, so wird die nächstliegende Zahl aus dem Wertebereich von xs:decimal gewählt. Wird ein Wert der Typen xs:float, xs:double oder xs:decimal nach xs:integer gewandelt, so wird der Nachkommaanteil weggelassen (es findet also keine Rundung statt):
xs:integer(19.999) = 19
Typumwandlung einer allgemeinen Sequenz
Da ein cast as nicht nur auf ein Literal, sondern auf einen beliebigen Ausdruck angewendet werden kann, kann es vorkommen, dass der Wert dieses Ausdrucks eine Sequenz mit mehr als einem Eintrag ist. In diesem Fall wird ein Fehler gemeldet.
Es kann aber auch sein, dass der Wert des umzuwandelnden Ausdrucks eine leere Sequenz ist. Auch in diesem Fall wird ein Fehler erzeugt, es sei denn, dass dieser Fall ausdrücklich erlaubt worden wäre, indem nach dem Zieltyp ein Fragezeichen (analog zu der Häufigkeitsangabe in DTD) angegeben wird. Der Ausdruck
() cast as xs:integer
erzeugt also einen Fehler, während
() cast as xs:integer?
zu keinem Fehler führt, sondern eine leere Sequenz zurückgibt.
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |