- XQuery
-
XQuery steht für XML Query Language und bezeichnet eine vom W3C spezifizierte Abfragesprache für XML-Datenbanken.
XQuery benutzt eine an XSLT, SQL und C angelehnte Syntax und verwendet XPath sowie XML Schema für sein Datenmodell und seine Funktionsbibliothek. XQuery ist aus den Sprachen XQL, XML-QL und Quilt hervorgegangen.
XQuery ist stark typisiert und Turing-vollständig.
Inhaltsverzeichnis
Sprachelemente
Außer Pfadausdrücken (XPath) gibt es eine ganze Reihe weiterer Spracheigenschaften, die in den folgenden Abschnitten anhand von kurzen Beispielen erläutert werden sollen.
Datenmodell
Die grundlegende Datenstruktur in XQuery ist eine Sequenz. Eine Sequenz ist eine geordnete Liste von keinem, einem oder mehreren Elementen. Eine Sequenz kann also auch ein XML-Dokument sein. Sequenzen werden in der Regel geklammert und können auch Duplikate enthalten. Sequenzen können nicht verschachtelt werden.
Folgende Sequenzen sind identisch:
(1, 2, 1) und (1, (2, 1))
(1, (), ) und (1, )
(<A/>) und <A/>
XQuery stellt sechs Funktionen zur Abfrage von Kardinalitäten auf Sequenzen zur Verfügung:
- fn:zero-or-one($seq)
- fn:one-or-more($seq)
- fn:exactly-one($seq)
- fn:empty($seq)
- fn:exists($seq)
- fn:count($seq)
Variablen werden in XQuery mit $-Präfix bezeichnet.
Bearbeiten von Sequenzen
- Der Kommaoperator hängt zwei Sequenzen hintereinander
- Werte hinzufügen kann man mit der Funktion fn:insert-before
- Werte löschen kann man mit der Funktion fn:remove
- Werte neu anordnen kann man mit der Funktion fn:reverse
- Werte umsortieren kann man mit der Funktion fn:unordered
Konstruktion von XML-Elementen
Direkte XML-Konstruktion mit konstanten Elementnamen ("direct constructors"):
<html> <head> { $page/head/content() } </head> <body bgcolor={ $style/bgcolor/text() } > { $page/body/content() } </body> </html>
"Computed constructors"
element html { element head { $page/head/content() } element body { attribute bgcolor { $style/bgcolor/text() }, text { $page/body/content() } } }
Zur Konstruktion von XML-Daten stehen sowohl die direkte Schreibweise als XML als auch die eher deklarative Konstruktion mittels der sogenannten "computed constructors" zur Verfügung. In beiden Fällen dienen die geschweiften Klammern { ... } zur Einbettung von beliebigen weiteren XQuery-Ausdrücken in den Konstruktor.
Sortier-Funktionalität ("order by")
Im Gegensatz zur Relationalen Algebra und zu SQL besitzen XML-Datenelemente eine implizit vorgegebene Ordnung ("document order"). Alle XQuery-Ausdrücke müssen diese Ordnung erhalten, es sei denn, dies wird im Ausdruck explizit ausgeschaltet (Ordering mode: unordered).
FLWOR-Ausdrücke
Eine zentrale Rolle in XQuery spielen die sogenannten FLWOR-Ausdrücke (ausgesprochen: flower). FLWOR ist eine Abkürzung für die Konstrukte
for, let, where, order by
undreturn
, und kann als Analogie zu den (SELECT, FROM, WHERE) - Konstrukten in SQL betrachtet werden. Im Unterschied zu SQL sind FLWOR-Ausdrücke allerdings case-sensitive. FLWOR-Ausdrücke bilden Sequenzen auf Sequenzen ab (vgl. Datenmodell). FLWOR-Ausdrücke besitzen die folgende generische Form:for $forvar1 at $posvar1 in <Expr>, $forvar2 at $posvar2 in <Expr> ... let $letvar1 := <Expr>, $letvar2 := <Expr> ... where <BoolExpr> order by <Expr> ascending/descending return <Expr>
Hierbei steht
<Expr>
für beliebige andere XQuery-Ausdrücke, und<BoolExpr>
für einen Ausdruck vom Typ boolean. Diefor
-Konstrukte binden ihre Variablen$forvar1, $forvar2, ...
sequentiell an je einen Wert aus den Bindungssequenzen<Expr>
. Über das Schlüsselwortat
kann die Position der vorherstehenden Variable in der<Expr>
-Sequenz an eine Positionsvariable gebunden werden, wobei die Nummerierung bei 1 beginnt. Im Unterschied dazu binden dielet
-Konstrukte ihre Variablen$letvar1, $letvar2, ...
an das gesamte Ergebnis des assoziierten Ausdrucks. Die sich ergebende Tupelfolge beinhaltet alle möglichen Kombinationen von Variablenbindungen, die sich aus der Belegung der for- und let-Variablen bilden lassen.Das
where
-Konstrukt dient zur Eliminierung unerwünschter Tupel. Sinnvollerweise nimmt sein boolescher Ausdruck Bezug auf mindestens eine der in denfor
- undlet
-Konstrukten gebundenen Variablen. Das gleiche gilt für dasorder by
-Konstrukt, das zum Sortieren der Tupel dient. Imreturn
-Konstrukt werden schließlich die Variablen von Interesse zurückgegeben, möglicherweise eingebettet in direkt oder indirekt konstruierte Elemente. In komplexeren Fällen werden FLWOR-Ausdrücke auch geschachtelt, das bedeutet, dass an der Stelle von jedem Vorkommen von<Expr>
wiederum ein beliebiger FLWOR-Ausdruck stehen kann.Das nachfolgende Beispiel veranschaulicht die Verwendung von
for
undlet
. Derfor
-Teil des Ausdrucks selektiert alle Paragraphen innerhalb einer HTML-Seite (<p>-Elemente). Imlet
-Teil wird für jeden Paragraph mit Hilfe von vordefinierten Funktionen die Zahl der Worte ermittelt. Anschließend werden alle nicht leeren Paragraphen (Wortzahl > 0) um eine Größenangabe erweitert und ausgegeben.for $par in $page//p let $words := fn:count(fn:tokenize($par/content(), " \n\t")) where $words gt 0 return <p> {$par/content()}<br/> Size: { $words } </p>
Zu beachten ist bei diesem Ausdruck, dass
for
- undlet
-Teil abhängig voneinander sind, die imfor
-Teil deklarierte Variable$par
wird imlet
-Teil verwendet. Für die Auswertung bedeutet dies, dass derlet
-Teil für jede Belegung der Variable$par
neu ausgewertet werden muss.Verbundoperationen und Gruppierungen
Verbundoperationen (oder engl. Joins) bezeichnen eine Mengenoperation bestehend aus der Bildung eines kartesischen Produktes zweier Eingabemengen und einer nachfolgenden Selektion (vergl. Relationale Algebra). Im Beispiel des vorherigen Abschnitts zu FLWOR-Ausdrücken ist bereits eine solche Verbundoperation gezeigt. Die Bindungen der in den
for
- undlet
-Teilen deklarierten Variablen bilden die jeweiligen Eingabemengen auf deren kartesisches Produkt die Selektionsbedingungen deswhere
-Teils angewandt werden. Da Selektionsbedingungen sowohl imwhere
-Teil des Ausdrucks als auch innerhalb derfor
- undlet
-Teile in Subausdrücken auftreten können, ist vor der Auswertung eines Ausdrucks eine Normalisierung notwendig.Vordefinierte Funktionen
Zur Berechnung arithmetischer Gleichungen sowie Datumsberechnungen sowie zur Bearbeitung von Sequenzen im Datenmodell.
Benutzerdefinierte Funktionen
Mittels
declare function
können benutzerdefinierte Funktionen deklariert werden. Die allgemeine Form sieht folgendermaßen aus:declare function namespace:funktionsname ($parameter1 as datentyp1, $parameter2 as datentyp2, ...) as rückgabedatentyp { <XQuery-Ausdruck> }
Funktionen können andere Funktionen und sich selbst rekursiv aufrufen, damit ist XQuery Turing-vollständig.
Verschiedene Vergleichsoperatoren
XQuery kennt zwei Typen von Vergleichsfunktionen: wertqualifizierend oder existenzqualifizierend. Die wertqualifizierenden Operatoren ähneln den üblichen Operatoren aus anderen Programmiersprachen. Folgende Operatoren sind definiert
- eq: Prüft auf Gleichheit (equal)
- ne: Prüft auf Ungleichheit (not equal)
- lt: Prüft auf Kleiner (less than)
- gt: Prüft auf Größer (Greater than)
- le: Prüft auf Kleiner-Gleich (Less or equal)
- ge: Prüft auf Größer-Gleich (Greater or equal)
Die „üblichen“ Vergleichsoperatoren (
=
,!=
,<
,>
,<=
,>=
) führen einen existenziellen Vergleich durch. Dabei können links und rechts des Operators Sequenzen stehen. So ist der Ausdruckseq1 OP seq2
genau dann wahr, wenn ein Elemente1
ausseq1
und eine2
ausseq2
existieren mite1 OP e2
, wobeiOP
einer der Operatoren=
,!=
,<
,>
,<=
oder>=
ist. So ist(1, 2) > (3, 0)
wahr, da1 > 0
ist.XQuery ist dazu gedacht, aus großen XML-Datensammlungen einzelne Teile herauszusuchen. Im Gegensatz dazu dient XSLT dazu, komplette XML-Dokumente zu transformieren.
Beispiele
Zählen aller question-XML-Elemente im Quelldokument:
fn:count(//question)
Komplexeres Beispiel, Auflisten aller Fragen aller Dokumente einer Galerie für KEduca, die weniger als zwei Antworten haben:
<noanswerquestions> { for $s in (fn:doc("lpi101.edugallery")//server/@address) for $d in (fn:doc($s)[(count(true) + count(false)) <= 1]) return <doc src="{$s}">{ for $q in ($d//question[(count(true) + count(false)) <= 1]) return $q }</doc> } </noanswerquestions>
Ein weiteres Beispiel (zeigt die Möglichkeit der indirekten Umstrukturierung durch XQuery)
- Quell-Dokument:
<?xml version="1.0" encoding="ISO-8859-1"?> <partlist> <part partid="0" name="car"/> <part partid="1" partof="0" name="engine"/> <part partid="2" partof="0" name="door"/> <part partid="3" partof="1" name="piston"/> <part partid="4" partof="2" name="window"/> <part partid="5" partof="2" name="lock"/> <part partid="10" name="skateboard"/> <part partid="11" partof="10" name="board"/> <part partid="12" partof="10" name="wheel"/> <part partid="20" name="canoe"/> </partlist>
- Ziel-Dokument:
<parttree> <part partid="0" name="car"> <part partid="1" name="engine"> <part partid="3" name="piston"/> </part> <part partid="2" name="door"> <part partid="4" name="window"/> <part partid="5" name="lock"/> </part> </part> <part partid="10" name="skateboard"> <part partid="11" name="board"/> <part partid="12" name="wheel"/> </part> <part partid="20" name="canoe"/> </parttree>
- Lösung in XQuery:
declare function local:one_level ($p as node()) as node() { <part partid="{$p/@partid}" name="{$p/@name}"> { for $s in doc("data/parts-data.xml")//part where $s/@partof =$p/@partid return local:one_level($s) } </part> }; <parttree> { for $p in doc("data/parts-data.xml")//part [empty(@partof)] return local:one_level($p) } </parttree>
Anwendung
Unter anderem findet XQuery in der Datenbankwelt Anwendung. Aufgrund der Wichtigkeit von XML und historisch bedingt hoher Datenbestände in relationalen Datenbanken wurde von der ISO eine Erweiterung des SQL Standards namens SQL/XML entwickelt, um die Möglichkeiten von XML und SQL zu kombinieren. Als Abfragesprache zur Abfrage von XML Daten im Rahmen der SQL Funktion XMLQuery wurde XQuery definiert.[1]
Implementierungen
- BaseX, Open Source, unterstützt XQuery Full-Text und XQuery Update; Live-Demo
- eXist, Open Source, unterstützt XQuery Update, umfangreiche Bibliotheken zur Erstellung von Webanwendungen
- Galax, frei verfügbar, unterstützt XQuery Update
- Pathfinder, XQuery-Compiler für relationale Back-Ends; bildet zusammen mit MonetDB die XQuery-Implementierung MonetDB/XQuery
- XQilla, Open Source (Apache License v2), XPath 2.0, XQuery Update, XQuery Full-Text, partial XSLT
- Zorba, von der FLWOR-Foundation; Live-Demo
Weblinks
Literatur
- ↑ Michael Wagner: SQL/XML:2006 - Evaluierung der Standardkonformität ausgewählter Datenbanksysteme. Diplomica Verlag 2010, ISBN 3836696096
- Priscilla Wamsley: XQuery. O'Reilly Media, Beijing 2007, ISBN 978-0596006341.
- Margit Becher: XML - DTD, XML-Schema, XPath, XQuery, XSLT, XSL-FO, SAX, DOM. W3L Verlag, Witten 2009, ISBN 978-3-937137-69-8.
Standards des World Wide Web ConsortiumsEmpfehlungen (Recommendations): ATAG | Canonical XML | CSS | CharMod | CC/PP | DDR Simple API | DOM | EXI | Element Traversal | EMMA | GRDDL | HTML | ITS | MathML | OWL | P3P | PICS | PLS | PNG | POWDER | RDF | RDF-Schema | Ruby | SISR | SKOS | SML | SMIL | SOAP | SOAP MTOM | SPARQL | SRGS | SSML | SVG | SSML | UAAG | VoiceXML | WCAG | Webarch | WebCGM | WSDL | WS-Adressing | WS-Policy | XHTML | XML | XInclude | XKMS | XLink | XML Base | XMLEnc-Decrypt | XML Events | XML Information Set | XML Namespace | XML Schema | XML Signature | XOP | XForms | XPath | XPointer | XProc | XQuery | XSL | XSLT
Arbeitsentwürfe (Working Drafts) und Kandidaten (Candidate Recommendations): Capture API | CCXML | CDF | Clipboard API | Contacts API | Cross-Origin Resource Sharing | CURIE | EARL | File API | HTML5 | HTML Canvas | HTML Microdata | Indexed Database API | InkML | LTLI | RIF | Selectors API | System Information API | WAI-ARIA | Web IDL | Web Sockets API | Web SQL Database | WICD | Widgets | XFrames | XBL
Wikimedia Foundation.
Schlagen Sie auch in anderen Wörterbüchern nach:
XQuery — is a query language (with some programming language features) that is designed to query collections of XML data. It is semantically similar to SQL.XQuery 1.0 was developed by the XML Query working group of the W3C. The work was closely… … Wikipedia
XQUERY — steht für XML Query Language und bezeichnet eine vom W3C spezifizierte Abfragesprache für XML Datenbanken. XQuery benutzt eine an XSLT, SQL und C angelehnte Syntax und verwendet XPath sowie XML Schema für sein Datenmodell und seine… … Deutsch Wikipedia
Xquery — steht für XML Query Language und bezeichnet eine vom W3C spezifizierte Abfragesprache für XML Datenbanken. XQuery benutzt eine an XSLT, SQL und C angelehnte Syntax und verwendet XPath sowie XML Schema für sein Datenmodell und seine… … Deutsch Wikipedia
XQuery — est un langage de requête informatique permettant non seulement d extraire des informations d un document XML, ou d une collection de documents XML, mais également d effectuer des calculs complexes à partir des informations extraites et de… … Wikipédia en Français
Xquery — est un langage de requête informatique permettant non seulement d extraire des informations d un document XML, ou d une collection de documents XML, mais également d effectuer des calculs complexes à partir des informations extraites et de… … Wikipédia en Français
XQuery — XQuery язык запросов, разработанный для обработки данных в формате XML. XQuery использует XML как свою модель данных. XQuery 1.0 был разработан рабочей группой XML Query в составе организации W3C. Эта работа координируется другой рабочей… … Википедия
XQuery — es un lenguaje de consulta diseñado para colecciones de datos XML. Es semánticamente similar a SQL, aunque incluye algunas capacidades de programación. XQuery 1.0 fue desarrollado por el grupo de trabajo de Consulta XML del W3C. El trabajo fue… … Wikipedia Español
XQuery Update Facility — XQuery Update XQuery Update Facility est une extension de XQuery, un langage de requête XML standardisé par le W3C. Cette extension fournit les moyens de modifier des instances du modèle de données XQuery ou XPath 2 (documents ou bases de… … Wikipédia en Français
XQuery Update — Facility est une extension de XQuery, un langage de requête XML standardisé par le W3C. Cette extension fournit les moyens de modifier des instances du modèle de données XQuery ou XPath 2 (documents ou bases de données). XQuery Update est une… … Wikipédia en Français
XQuery Update Facility — is an extension to the XML Query language, XQuery. It provides expressions that can be used to make changes to instances of the XQuery 1.0 and XPath 2.0 Data Model.It became a W3C Candidate Recommendation on 14 March 2008.Implementations*… … Wikipedia