Als Abfragesprache für XML-Dokumente scheint sich XQuery durchzusetzen. Im April 2005 wurde unter der Adresse http://www.w3.org/TR/xquery
der letzte W3C Working Draft veröffentlicht.
In XQuery werden Abfragen durch eine Kombination von FLWR-Ausdrücken, Pfadausdrücken und Element-Konstruktoren formuliert. Ein FLWR-Ausdruck (gesprochen wie das englische Wort Flower) besteht aus einer Sequenz der Schlüsselworte FOR, LET, WHERE, RETURN. Ein Pfadausdruck nach der XPath-Syntax ( http://www.w3.org/TR/xpath.html ) fasst das Dokument als Baum von Element-Knoten auf und liefert durch gezielte Navigation den gewünschten Teilbaum ab. Dabei trennt ein einzelner Schrägstrich ('/') Elemente in direkter Vater/Sohn-Beziehung, ein doppelter Schrägstrich ('//') bedeutet eine Nachkommen-Beziehung über eine oder auch mehrere Baum-Ebenen. Element-Konstruktor klammert das Ergebnis der Query mit öffnenden und schließenden Tags.
Da XML-Fragmente bereits gültige XQuery-Ausdrücke darstellen, müssen sie durch geschweifte Klammern ({,}) gekennzeichnet werden, andernfalls würden sie wie normaler Text behandelt und ausgegeben.
<aktive-Dozenten>
{FOR $d IN distinct(document("dozenten.xml")//dozent)
LET $v := document("vorlesungen.xml")//vorlesung[gelesenVon=$d/PersNr]
WHERE $v/SWS > 2
RETURN <Dozent>$d/Name</Dozent>}
</aktive-Dozenten>
Das Ergebnis würde lauten:
<aktive-Dozenten>
<Dozent>
<name>
Sokrates
</name>
</Dozent>
<Dozent>
<name>
Kant
</name>
</Dozent>
<Dozent>
<name>
Russel
</name>
</Dozent>
</aktive-Dozenten>
<Vorlesungsverzeichnis>
{FOR $d IN document("dozenten.xml")//dozent,
$v IN document("vorlesungen.xml")//vorlesung
WHERE $d/PersNr = $v/gelesenVon
RETURN <Veranstaltung>$d/Name, $v/Titel</Veranstaltung>}
</Vorlesungsverzeichnis>
<Vorlesungsverzeichnis>
{FOR $d IN document("dozenten.xml")//dozent
RETURN
<Dozent>$d/Name</Dozent>
{FOR $v IN document("vorlesungen.xml")//vorlesung
WHERE $d/PersNr = $v/gelesenVon
RETURN <Vorlesung>$v/Titel</Vorlesung>}}
</Vorlesungsverzeichnis>
<Dozenten>
{FOR $d IN document("dozenten.xml")//dozent
LET $s := sum(document("vorlesungen.xml")
//vorlesung[gelesenVon=$d/PersNr]/SWS)
WHERE $s > 0
RETURN <Dozent>
<Name>$d/Name</Name>
<Lehrbelastung>$s</Lehrbelastung>
</Dozent>}
</Dozenten>
<Rang-wie-Sokrates>
{FOR $d1 IN document("dozenten.xml")//dozent[Name="Sokrates"],
$d2 IN document("dozenten.xml")//dozent[Rang=$d1/Rang]
RETURN <Name>$d2/Name</Name>}
</Rang-wie-Sokrates>