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

Let- und For-Klausel

Let- und for-Klauseln ermöglichen die Bindung von Variablen an Ergebnisse von beliebigen XQuery-Ausdrücken, wobei, wie im weiteren Verlauf gezeigt wird, üblicherweise die Ergebnisse von Pfadausdrücken an Variablen in let- und for-Klauseln gebunden werden. Jede Variable, die in einer let- oder for-Klausel gebunden wird, ist ab diesem Zeitpunkt bekannt und in allen nachfolgenden Konstrukten
(de-)referenzierbar. Die Semantik der beiden Klauseln unterscheidet sich wie folgt:

  • let-Klausel: Das Ergebnis des Ausdrucks wird vollständig als Sequenz von Knoten und/oder Werten an die Variable gebunden.
  • for-Klausel: Bei der for-Klausel wird das Ergebnis des Ausdrucks elementweise an die Variable gebunden und das nachfolgende Anfragekonstrukt für jedes Element einzeln ausgeführt.

Die unterschiedliche Semantik wird dabei bereits in der Grammatik deutlich, indem let-Klauseln das gesamte Ergebnis eines Ausdrucks mit := an die jeweilige Variable binden, während bei for-Klauseln die Grammatik die Benutzung des Schlüsselwortes in erfordert.

Zu beachten ist an dieser Stelle, dass innerhalb einer XQuery-Anweisung – im Gegensatz zu klassischen programmiersprachlichen Konzepten – ein Variablenbezeichner nicht mehrfach auf der linken Seite, d. h. im Rahmen einer Wertzuweisung, verwendet werden darf.

Exemplarisch wird die unterschiedliche Semantik von let- und for-Klauseln durch folgenden FLWOR-Ausdruck deutlich, bei dem Berufsgruppen aufgelistet werden sollen. Eine let-Klausel bindet die Liste mit den drei Einträgen an die Variable $x und aktiviert einmalig den return-Operator zur Erzeugung des Ergebnisdokumentes.

let $x := (<Arzt/>, <Pfleger/>, <Techniker/>)
return
<Berufsgruppen>{ $x }</Berufsgruppen>

Dieser FLWOR-Ausdruck liefert das folgende Ergebnis:

<Berufsgruppen><Arzt/><Pfleger/><Techniker/></Berufsgruppen>

Im Gegensatz dazu würde eine for-Klausel (for $x in (...)) statt der let-Klausel bewirken, dass der return-Operator für jede Belegung der Variablen $x aufgerufen wird, so dass folgendes Ergebnis konstruiert werden würde:

<Berufsgruppen><Arzt/></Berufsgruppen>
<Berufsgruppen><Pfleger/></Berufsgruppen>
<Berufsgruppen><Techniker/></Berufsgruppen>

Um dennoch das gleiche Ergebnis wie oben zu erzielen, müsste der Elementkonstruktor für die Wurzel des Ergebnisdokumentes nach außen gezogen und damit der FLWOR-Ausdruck in die Elementkonstruktion eingeschoben werden:

<Berufsgruppen>
{
for $x in (<Arzt/>, <Pfleger/>, <Techniker/>)
return $x
}
</Berufsgruppen>

Mit der Verwendung des berechneten Elementkonstruktors würde dies zu der folgenden äquivalenten Anfrageformulierung führen:

element Berufsgruppen
{
for $x in (<Arzt/>, <Pfleger/>, <Techniker/>)
return $x
}

Auswertungskontext

Anzumerken ist an dieser Stelle die Eröffnung eines neuen Auswertungskontextes. Der obige FLWOR-Ausdruck muss in einem neuen Auswertungskontext auftreten, da sich der Anfrageprozessor nach dem Beginn des Elementes <Berufsgruppen> im statischen Modus befindet und das Fehlen der {}-Klammern keine Auswertung des FLWOR-Ausdrucks, sondern nur eine textuelle Ausgabe initiieren würde. Analog verhält es sich innerhalb einer return-Klausel. Wird ohne zusätzliche XML-Tags eine Variable dereferenziert, so befindet sich der Prozessor noch im Auswertungsmodus. Sobald jedoch, wie im obigen let-Beispiel, eine Variable innerhalb eines Tags in einer return-Klausel auftritt, muss diese innerhalb eines neuen Auswertungskontextes dereferenziert werden.

 

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

<< zurückvor >>