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

Bindung mehrerer Variablen

In einem FLWOR-Ausdruck können potenziell mehrere Variablen gleichzeitig durch eine let- bzw. for-Anweisung gebunden werden.

let $x := ..., $y := ...for $x in ..., $y in ...

ist dabei äquivalent zu:

let $x := ...for $x in ...
let $y := ...for $y in ...

Es ist jedoch darauf zu achten, dass die Reihenfolge der Bindung ohne weitergehende explizite Sortierung durch die order by-Klausel Einfluss auf die Aufrufreihenfolge des return-Operators besitzt. Je früher die Bindung erfolgt, desto stärker ist der Einfluss der Variablen auf die Ausgabereihenfolge bei der Erstellung des Ergebnisses. Des Weiteren können Variablen in Abhängigkeit bereits deklarierter Variablen definiert werden, zum Beispiel:

let $x := fn:doc("Hochwaldklinik.xml")
for $y in $x//Arzt,
$z in $x//Station
...

Die Auswirkungen des Bindezeitpunktes lassen sich schön am Konzept der Positionsvariablen innerhalb einer for-Klausel demonstrieren. Eine Positionsvariable – standardmäßig vom Typ xs:integer – kann optional bei der Bindung an eine Variable mit dem Schlüsselwort at angegeben werden und reflektiert den Index des jeweils gerade bearbeiteten Elementes bzw. die Nummer des jeweiligen Durchlaufs. Der folgende FLWOR-Ausdruck liefert zu jedem Eintrag die korrespondierende Position im Ergebnis:

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

<Berufsgruppen>
<LfdNr>1</LfdNr><Arzt/>
<LfdNr>2</LfdNr><Pfleger/>
</Berufsgruppen>

Die Auswirkungen unterschiedlicher Anordnungen von for-Klauseln sind nun mit Hilfe der Positionsvariablen illustrierbar. Folgende exemplarische Ausdrücke bilden Paare von Berufen und Orten, wobei die zuerst eingeführte Variable dominant gegenüber den später gebundenen Variablen ist:

for $x at $i infor $y at $j in
(<Arzt/>, <Pfleger/>)(<Labor/>, <Station/>)
for $y at $j infor $x at $i in
(<Labor/>, <Station/>)(<Arzt/>, <Pfleger/>)
returnreturn
<Zuordnung><Zuordnung>
<Beruf>{$i}</Beruf><Beruf>{$i}</Beruf>
<Ort>{$j}</Ort><Ort>{$j}</Ort>
</Zuordnung></Zuordnung>

Die Ergebnisse der beiden Anfragen mit jeweils vertauschten for-Klauseln unterscheiden sich in der Reihenfolge der Paarbildung:

<Zuordnung><Zuordnung>
<Beruf>1</Beruf><Ort>1</Ort><Beruf>1</Beruf>Ort>1</Ort>
<Beruf>1</Beruf><Ort>2</Ort><Beruf>2</Beruf>Ort>1</Ort>
<Beruf>2</Beruf><Ort>1</Ort><Beruf>1</Beruf>Ort>2</Ort>
<Beruf>2</Beruf><Ort>2</Ort><Beruf>2</Beruf>Ort>2</Ort>
</Zuordnung></Zuordnung>

 

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

<< zurückvor >>