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>