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

Ausblick auf XQuery

Nachdem nun die XML-Grundlagen aufgefrischt und damit die Voraussetzungen für die detaillierte Einführung in XQuery gegeben sind, werden wir nacheinander einzelne Bausteine von XQuery vorstellen. Wir beginnen mit dem Typkonzept, gefolgt von einfachen XQuery-Ausdrücken, den so genannten FLWOR-Ausdrücken und weiteren XQuery-Ausdrücken und Funktionen. Dieses Vorgehen reflektiert einen systematischen Aufbau, könnte aber andererseits auch für manchen Leser, der XQuery noch gar nicht kennt, den Wunsch nach einem frühen Gesamtüberblick wecken. Daher geben wir in diesem Kapitel einen ganz knappen ersten Ausblick auf XQuery, in dem die wichtigsten Bausteine schon einmal angerissen werden. Dabei werden wir uns auf das am Anfang der XQuery-Kapitel vorgestellte Krankenhausbeispiel beziehen.

Die aus XPath 1.0 bekannten Pfadausdrücke sind nach XQuery übernommen worden. Ein Pfadausdruck ist damit schon ein einfacher XQuery-Ausdruck, der die Navigation in Dokumenten erlaubt. Allerdings muss immer ein Bezugspunkt (Kontext) für den Pfadausdruck hergestellt werden. Im Allgemeinen wird sich ein Pfadausdruck auf Daten in Dateien oder Datenbanken beziehen. Viele Pfadausdrücke beginnen daher mit dem Zugriff auf solche Daten, um darauf dann zu navigieren. Einen solchen Zugriff erlaubt die Funktion fn:doc(), die eine URI als Eingabeargument erhält und das adressierte Dokument zurückliefert, so dass Pfadausdrücke darauf angewendet werden können. Der folgende Ausdruck ist somit eine gültige XQuery-"Anfrage" und liefert alle Ärzte der Hochwaldklinik:

fn:doc("http://www.xquery-buch.de/Hochwaldklinik.xml")//Arzt

Die in XQuery eingebauten Funktionen gehören alle zu einem Namensraum, für den fn als Präfix vordefiniert ist. Nun kann XQuery natürlich mehr als nur in Dokumenten navigieren. Eine wichtige Funktionalität ist die Konstruktion von Ergebnissen. So genannte Elementkonstruktoren erlauben es, die Struktur eines XQuery-Ergebnisses frei zu definieren. Die Syntax dazu entspricht der Elementsyntax von XML. Folgender Ausdruck erzeugt ein Element, das eine Station beschreibt:

<Station Leitung="Pfleger_01">
<Name>Notaufnahme</Name>
<Standort>Vorort</Standort>
</Station>

Ein solches Element aus statischen Einträgen ist nur begrenzt nützlich. Daher kann der Elementinhalt auch dynamisch berechnet werden. Dazu werden Ausdrücke, die berechnet werden sollen, in geschweifte Klammern eingefasst. Der folgende Ausdruck liefert die Ärzte einer Klinik als Kindelemente eines Elementes Arztliste:

<Arztliste>
{
fn:doc("http://www.xquery-buch.de/Hochwaldklinik.xml")//Arzt
}
</Arztliste>

Wenn beispielsweise nicht alle Daten eines Arztes, sondern nur sein Vor- und Nachname ausgegeben werden sollen, wird noch mehr Flexibilität benötigt. Die Arzt-Elemente werden im folgenden Beispiel einzeln betrachtet und nur Vor- und Nachname werden in das Ergebnis übernommen:

<Arztliste>
{
for $arzt in
fn:doc("http://www.xquery-buch.de/Hochwaldklinik.xml")//Arzt
return
<Arzt>
{$arzt//Vorname}
{$arzt//Nachname}
</Arzt>
}
</Arztliste>

Im Beispiel ergibt sich:

<Arztliste>
<Arzt>
<Vorname>Benjamin</Vorname>
<Nachname>Naumann</Nachname>
</Arzt>
<Arzt>
<Vorname>Susan</Vorname>
<Nachname>Shore</Nachname>
</Arzt>
<Arzt>
<Vorname>Phillip</Vorname>
<Nachname>Meier</Nachname>
</Arzt>
</Arztliste>

Dies ist nun schon das erste Beispiel eines FLWOR-Ausdrucks, des mächtigsten XQuery-Konstrukts. In einem FLWOR-Ausdruck werden zunächst Variablen an Werte gebunden. Geschieht das in einer for-Klausel, wie im obigen Beispiel, dann werden nacheinander alle Werte der rechten Seite an die Variable gebunden. Geschieht es jedoch in einer let-Klausel, dann werden alle Werte auf einmal an die Variable gebunden. Wird im obigen Ausdruck das for $arzt in durch ein let $arzt := ersetzt, dann ergibt sich

<Arztliste>
<Arzt>
<Vorname>Benjamin</Vorname>
<Vorname>Susan</Vorname>
<Vorname>Phillip</Vorname>
<Nachname>Naumann</Nachname>
<Nachname>Shore</Nachname>
<Nachname>Meier</Nachname>
</Arzt>
</Arztliste>

Das liegt daran, dass alle Arzt-Elemente auf einmal an die Variable $arzt gebunden werden und daher der Ausdruck $arzt//Vorname die Vornamen aller Ärzte zum Ergebnis hat. Schließlich kann auch noch eine Auswahl getroffen werden, indem ähnlich wie bei SQL eine where-Klausel eingesetzt wird:

<Arztliste>
{
for $arzt in
fn:doc("http://www.xquery-buch.de/Hochwaldklinik.xml")//Arzt
where $arzt/Adresse/Stadt="Berlin"
return
<Arzt>
{$arzt//Vorname}
{$arzt//Nachname}
</Arzt>
}
</Arztliste>

Das Ergebnis kann auch sortiert werden:

<Arztliste>
{
for $arzt in
fn:doc("http://www.xquery-buch.de/Hochwaldklinik.xml")//Arzt
where $arzt/Adresse/Stadt="Berlin"
order by $arzt//Nachname, $arzt//Vorname
return
<Arzt>
{$arzt//Vorname}
{$arzt//Nachname}
</Arzt>
}
</Arztliste>

Nun erklärt sich auch der Name FLWOR-Ausdruck, nämlich aus den Klauseln for, let, where, order by und return. Da for- und let-Klauseln mehrfach auftreten können und auch mehrere Variablen in diesen Klauseln gebunden werden können, lassen sich mit FLWOR-Ausdrücken Daten in komplexer Weise verknüpfen. Dies sei mit einem einfachen Verbund angedeutet, in dem zu jeder Station der Name des leitenden Pflegers ausgegeben wird:

let $k := fn:doc("http://www.xquery-buch.de/Hochwaldklinik.xml")
for $station in $k//Station,
$pfleger in $k//Pfleger
where $station/@Leitung = $pfleger/@ID
return
<Station>
{$station/Name}
<Leitung>
{$pfleger//Vorname}
{$pfleger//Nachname}
</Leitung>
</Station>

Im Beispielszenario ergibt sich:

<Station>
<Name>Notaufnahme</Name>
<Leitung>
<Vorname>Dagmar</Vorname>
<Nachname>Guldenstern</Nachname>
</Leitung>
</Station>
<Station>
<Name>Rehabilitation</Name>
<Leitung>
<Vorname>Sandy</Vorname>
<Nachname>Murawitz</Nachname>
</Leitung>
</Station>
...

Ebenso ist eine Gruppierung möglich, wie der folgende XQuery-Ausdruck zeigt, der das Pflegepersonal nach Stationen gruppiert auflistet:

let $k := fn:doc("http://www.xquery-buch.de/Hochwaldklinik.xml")
for $station in $k//Station
return
<Station>
{$station/Name}
<Pflegepersonal>
{for $pfleger in $k//Pfleger
where $pfleger/@Station = $station/Name/text()
return $pfleger//Nachname}
</Pflegepersonal>
</Station>

XQuery bietet auch eine große Zahl eingebauter Funktionen, die spätestens im Kapitel Funktionen in XQuery vorgestellt werden. Das folgende Beispiel zeigt den Aufruf einer solchen Funktion. Das Pflegepersonal wird nicht mehr aufgelistet, sondern nur noch gezählt:

let $k := fn:doc("http://www.xquery-buch.de/Hochwaldklinik.xml")
for $station in $k//Station
return
<Station>
{$station/Name}
<Pflegepersonal>
{fn:count(for $pfleger in $k//Pfleger
where $pfleger/@Station = $station/Name/text()
return $pfleger)}
</Pflegepersonal>
</Station>

Diese Beispiele mögen genügen, um einen ersten Eindruck von XQuery zu erhalten und die Konzepte, die in den folgenden Kapiteln eingeführt werden, einordnen zu können.

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

<< zurückvor >>