Typzuweisung
Dokumentknoten und Elementknoten können mit der validate-Anweisung explizit gegen Schemadefinitionen validiert werden.
ValidateExpr | ::= | validate SchemaMode? SchemaContext? { Expr } |
SchemaMode | ::= | lax | strict | skip |
SchemaContext | ::= | (context SchemaContextLoc) | global |
Dies beinhaltet, dass dem entsprechenden Knoten der jeweilige Typ zugewiesen wird, wobei Vorbelegungswerte für Attribute ebenfalls wirksam werden. Da Elemente, die durch Elementkonstruktoren entstehen, automatisch der Validierung unterworfen werden, wie sie für die gesamte Anfrage definiert ist, besteht der Hauptanwendungsfall für validate darin, die Validierungsmodalitäten für einzelne Knoten zu ändern (beispielsweise zu unterdrücken).
Man kann validate aber auch verwenden, um zu prüfen, ob ein Eingabedokument dem erwarteten Schema genügt. In Anlehnung an die Validierungsmodi, die XML Schema für seine Wildcards (any) einführt, kennt XQuery die folgenden Validierungsmodi:
Validierungsmodus | Bedeutung |
---|---|
strict | Für alle Element- und Attributknoten muss eine Schemadefinition bekannt sein und alle Elementknoten müssen dieser entsprechen. |
skip | Es findet keine Validierung statt; alle Elementknoten erhalten den Typ xdt:untypedAny, alle Attributknoten den Typ xdt:untypedAtomic. |
lax | Für alle Element- und Attributknoten, für die eine Schema- definition bekannt ist, wird wie bei "strict" validiert, für alle anderen wie bei "skip". |
Tab. Liste der Validierungsmodi
Wie schon bei den Sequenztypen gibt es die Möglichkeit, die Validierung in einen Kontext zu stellen, um auch die Validierung gegen lokale Definitionen zu erlauben. Alternativ kann der Kontext global angegeben werden, was bedeutet, dass alle Schemadefinitionen, die benötigt werden, globale Definitionen sein müssen. Der Validierungsmodus kann beim Aufruf von validate jeweils weggelassen werden.
In diesem Fall vererbt sich der Validierungsmodus umgebender validate-Ausdrücke oder, falls es keine solchen gibt, der Gesamtanfrage. Im folgenden Beispiel wird die Validierung explizit ausgeschaltet, weil das konstruierte Element nicht dem Beispielschema genügt. Ohne den Aufruf von validate würde das Ergebnis der Elementkonstruktion gegen das Schema validiert, was zu einem Typfehler führen würde.
validate skip {<Arzt>
<Name>Ernst Müller</Name>
<Fähigkeit>Notfallarzt</Fähigkeit>
</Arzt>}
Typzusicherung
In einem komplexen XQuery-Ausdruck ist nicht immer offensichtlich, welchen Typ ein Ausdruck hat. Besonders schwierig ist dies oft für eine XQuery-Implementierung bei der Analyse einer XQuery. Daher muss in vielen Fällen bei der statischen Analyse einer Anfrage (d. h. einer Analyse, ohne dass die Anfrage auf konkrete Daten angewendet wird) auf eine strikte Typprüfung verzichtet werden.
Eine solche Prüfung ist dann erst zur Laufzeit möglich. Um diese Situation zu verbessern, aber auch, um dem Programmierer von XQuery-Anfragen Sprachmittel an die Hand zu geben, mit denen er seine Anfragen sicherer machen kann, bietet XQuery den treat as-Ausdruck an.
TreatExpr | ::= | Expr treat as SequenceType |
Mit treat as erfolgt eine Zusicherung über den Typ eines Ausdrucks. Im Gegensatz zu einem cast wird der Typ des Ausdrucks nicht geändert, sondern ein Fehler erzeugt, wenn der Ausdruck nicht dem angegebenen Typ entspricht. Der folgende Ausdruck erzeugt einen Fehler, wenn die Variable $a nicht an ein Element des Typs Arzt_T gebunden ist:
$a treat as element(*, Arzt_T)
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |