Typabfrage
Zur Abfrage des Typs eines Sequenzwertes stellt XQuery die beiden Ausdrücke instance of und typeswitch zur Verfügung. Der Auszug aus der Grammatik lautet dabei folgendermaßen:
InstanceofExpr | ::= | Expr instance of SequenceType |
TypeswitchExpr | ::= | typeswitch ( Expr ) CaseClause+ default ($ VarName)? return ExprSingle |
CaseClause | ::= | case ($ VarName as)? SequenceType return ExprSingle |
Der instance of-Operator liefert den Wert true, falls der Typ des ersten Operanden mit dem zu überprüfenden Datentyp übereinstimmt (oder von diesem abgeleitet ist). Die Integerzahl 4711 wird sowohl als Integer als auch als Dezimalzahl als auch als allgemeiner Eintrag (item) akzeptiert, wie folgendes Beispiel zeigt:
let $a := xs:integer(4711)
where $a instance of xs:integer
and $a instance of xs:decimal
and $a instance of item()
return
<Text>Dieser Text wird erscheinen.</Text>
Die Typüberprüfung ist nicht nur für atomare Typen, sondern für alle Sequenztypen möglich:
<Text>bla bla</Text> instance of element(*, xs:string)
Eine Serie von Typüberprüfungen kann in einem typeswitch-Ausdruck zusammengefasst werden. Ein typeswitch-Ausdruck entspricht dabei der aus vielen Programmiersprachen bekannten switch-Anweisung, nur dass hier nicht der Wert, sondern der Typ des Auswahlausdrucks über die gewählte Variante entscheidet. Ein typeswitch könnte auch durch eine Folge von instance of-Ausdrücken eingebettet in konditionale Ausdrücke simuliert werden – ein Unterschied besteht jedoch in der statischen Typprüfung.
Folgendes Beispiel liefert den Vergütungssatz für Überstunden in Abhängigkeit von der Berufsgruppe. Überstunden werden bei Ärzten beispielsweise mit 25€, bei Pflegepersonal nur mit 15€ entlohnt. Die Variable $a ist dabei an ein Element aus der Ersetzungsgruppe von Angestellte gebunden:
typeswitch ($a)
case element(*, Arzt_T) return 25
case element(*, Pfleger_T) return 15
case element(*, Techniker_T) return 20
case element(*, Sekretärin_T) return 10
default return 0
Im Allgemeinen besteht ein typeswitch-Ausdruck aus einer zu überprüfenden Ausprägung eines Sequenztyps (in obigem Beispielszenario ein Angestellter, gebunden an die Variable $a) und einer Liste von Fällen, die es schrittweise hinsichtlich einer Kompatibilität zu überprüfen gilt. Die Reihenfolge ist dabei entscheidend, so dass der erste Fall einer möglichen Typkompatibilität den Ausdruck zur Ermittlung des Rückgabewertes bestimmt. Falls in keinem explizit aufgeführten Fall eine Typübereinstimmung erzielt werden kann, wird der Ausdruck in der default-Klausel ausgewertet und als Rückgabewert verwendet.
Hängt der Rückgabewert in einer case- oder default-Klausel von der zu untersuchenden Sequenz ab, so kann darauf zurückgegriffen werden, indem zusätzlich eine Variable angegeben wird, welche den ursprünglichen Wert des Auswahlausdrucks mit Bezug auf den aktuell untersuchten Typ reflektiert. Folgender Ausdruck gibt ein spezielles Merkmal der jeweiligen Berufsgruppen zurück:
typeswitch ($a)
case $x as element(*, Arzt_T)
return <Merkmal>$x/Spezialgebiet</Merkmal>
case $x as element(*, Pfleger_T)
return <Merkmal>$x/Zertifikat</Merkmal>
case $y as element(*, Techniker_T)
return <Merkmal>$y/Fähigkeit</Merkmal>
case element(*, Sekretärin_T)
return <Merkmal/>
default return <Fehler/>
Eine zusätzliche Variable wird für die entsprechenden Berufsgruppen eingeführt. Für Sekretärinnen und den default-Fall ist dies nicht erforderlich. Der Geltungsbereich einer zusätzlich eingeführten Variablen umfasst dabei die Auswertung des Ausdrucks des entsprechenden Falls, so dass die Variablen nicht außerhalb referenziert werden dürfen. Daher ist es auch zulässig, denselben Bezeichner in mehreren case-Zweigen innerhalb eines typeswitch-Ausdrucks zu verwenden.
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |