FLWOR-Ausdrücke

Überblick

Der etwas kryptische Kürzel „FLWOR“ (sprich: „Flower“) steht für die Schlüsselwörter for, let, where, order by und return. In der Abfragesprache XQuery werden mit diesem Ausdruck Abfragen an eine XML-Datenbank abgesetzt. Diese Schlüsselwörter werden klein geschrieben und sollen SQL-ähnliche Abfragen ermöglichen, die eine Auswahl, Einschränkung und Sortierung sowie die Ausgabe in XML betreffen. Variablen sind case-sensitive d.h. auf Groß- und Kleinschreibung muss geachtet werden. XQuery Elemente und Variablen müssen mit gültigen XML Namen versehen sein. Ein String kann in einfachen oder doppelten Hochkommas stehen. Kommentare werden über (: und :) angelegt.[5]

Es gibt hier 2 Möglichkeiten Werte zu vergleichen. Mit dem allgemeinen Vergleich wird die Bedingung als wahr erkannt, wenn beliebig viele Attribute die Bedingung erfüllen. Zeichen hierfür sind =, !=, <, <=, >, >= Operatoren. Beim Wertvergleich werden stattdessen eq, ne, lt, le, gt, ge Operatoren genutzt (eq=equal, ne=not equal, lt=lower than, le=lower equal, gt=greater than, ge=greater equal). Hier wird die Bedingung als wahr erkannt, wenn genau ein Attribut die Bedingung erfüllt.[5]

Die Daten können als XML, (X)HTML oder Text Dokument sowie in anderen Formaten, wie PDF ausgegeben werden.
Zusätzlich sind auch 2 Gruppen von XQUERY-Funktionen vorhanden. Das sind die vordefinierten und die benutzerdefinierten Funktionen.

Die Funktion doc() macht eine einzelne Datei zur Abfrage verfügbar. Es können auch mehrere Datenquellen abgefragt werden, wobei ein gemeinsames Ergebnis-Dokument erstellt wird. Das wird dann Kollektion genannt. ([4] S.365, 371)


Syntax (Grundform):

for $var_1 in xpath_ausdruck_1
let $var_2 in xpath_ausdruck_2
where selektionsbedingung
order by sortierkriterium
return xml_ausdruck


Die FOR-Klausel (kann beliebig oft angegeben werden) iteriert über Knotenmengen. Dabei gibt der XPATH-Ausdruck an, über welche Knotenmenge iteriert wird ([3], S. 86). Diese FOR-Klausel muss mindestens einmal für eine Sequenz bzw. für die Knotenreferenzliste verwendet werden. Diese Klausel wird für iterative Operationen mit Sequenzen genutzt. Dadurch kann eine Operation für alle Elemente einer Sequenz durchgeführt werden. Enthält die Sequenz Knotenreferenzen, so wird eine Liste diese Knoten nacheinander durch gearbeitet. For-Klauseln lassen sich auch verschalteln.([4], S.367-370)

Die LET-Klausel (kann beliebig oft angegeben werden) deklariert eine XQuery-Variable und weist ihr einen Wert (Knoten) mit dem Operator := zu. ([1], S.44) Die Variable gilt innerhalb des FLWOR-Ausdrucks und muß mit einem Dollarzeichen beginnen.([4], S.367-370)

Mit der WHERE-Klausel (optional) kann eine Selektionsbedingung angegeben werden, die es ermöglicht, Knoten und Werte zu vergleichen, zu prüfen oder als Filter zu benutzen. Die WHERE-Klausel entspricht der Where-Funktion einer SQL-Abfrage. Diese Klausel ist zwar optional, darf aber bei Verwendung nur einmal am Ende des Ausdrucks hinter allen 'let-Klauseln' oder 'for-Klauseln' verwendet werden. Für komplexe Bedingungen können auch 'and' oder 'or'-Operatoren sowie Klammern verwendet werden.([4], S.367-370)

Die ORDER BY-Klausel (optional) ermöglicht die Sortierung der Ausgaben nach bestimmten Kriterien ([1], S.44). Mit den Schlüsselwörtern 'ascending' oder 'descending' kann die Sortierrichtung gesteuert werden. Die Nutzung ist ebenfalls optional. Sollte keine Klausel genutzt werden, wird die Sortierung durch die For-Klausel gesteuert.([4], S.367-370)

Mithilfe der RETURN-Klausel wird ein entsprechendes Ergebnis zurückgegeben. Dabei handelt es sich um eine Zusammensetzung neuer XML-Teilbäume aus den selektierten Fragmenten ([3], S. 86). Die RETURN-Klausel dient also dazu, das Ergebnis der Abfrage zu erzeugen. Das Ergebnis eines Ausdrucks kann einen Wert liefern, den ein anderer Ausdruck oder Funktion nutzt. Die Sequenz kann Knoten und atomare Werte oder ein Mix enthalten. Bedingte Ausdrücke werden mit if-then-else Struktur genutzt. Die Ausgabe kann hier benutzerdefiniert gesteuert werden.([4], S.367-370)


Beispiel:

for $personalliste in document("firma/firma.xml")/Firma/Mitarbeiter
let $name := $personalliste/Name/text()
let $vorname := $personalliste/Vorname/text()
order by $name, $vorname
return
<mitarbeiter>
{$name}, {$vorname}
</mitarbeiter>


Das obige Beispiel liefert alle Mitarbeiter mit ihren Namen und Vornamen. Die Funktion document() liefert ein XML-Dokument - anhand der übergebenen URL - zurück. Das bedeutet, dass in der for-Klausel im Dokument firma/firma.xml alle Mitarbeiter-Knoten durchlaufen werden. In den beiden folgenden let-Klauseln werden den Variablen der jeweilige Textknoten von Firma/Mitarbeiter/Name bzw. Firma/Mitarbeiter/Vorname gespeichert. Mit der order by-Klausel wird nach Namen und Vornamen aufsteigend sortiert. Zuletzt wird hier mit der return-Klausel ein XML-Ausdruck bestehend aus den Namen und Vornamen der Mitarbeitern erzeugt.


Quellen:

  • [1] Gorke, Bastian (2006): XML-Datenbanken in der Praxis. Praktischer Einblick in die Welt der XML-Datenbanken und ihrer Verwendung in Programmiersprachen. Bomots verlag. S. 42f.
  • [2] Kazakos, Wassilios; Schmidt, Andreas; Tomczyk, Peter (2002): Datenbanken und XML. Berlin Heidelberg: Springer. S. 86-88.
  • [3] Lausen, Georg; May, Wolfgang (2003): Anfragen, Ändern und Transformieren von XML. In: Web und Datenbanken. Konzepte, Architekturen, Anwendungen. Hrsg. von Erhard Rahm und Gottfried Vossen. Heidelberg: dpunkt. S. 82f.
  • [4] Vonhoegen Helmut (2011): Einstieg in XML – 6.Auflage Galileo Press - Bonn 2011 S.365, 371
  • [5] Institut für wissenschaftliche Information e.V. für XPath und XQuery - 12.08.2005

Weiterführende Links:

siehe auch:

Kategorie: XML, X