XML Query Language: Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
=Definition=
==Definition==


Die '''XML Query Language''' ist eine Abfragesprache für XML-Datenbanken und wird von der „XML Query Working Group“, einer Untergruppe der „XML Activity“ des [http://www.w3.org W3C], entwickelt. Derzeit im Status „Working Draft“ soll XQuery bald zum W3C-Standard werden.
Die '''XML Query Language''' ist eine Abfragesprache für XML-Datenbanken und wird von der „XML Query Working Group“, einer Untergruppe der „XML Activity“ des [http://www.w3.org W3C], entwickelt. Derzeit im Status „Working Draft“ soll XQuery bald zum W3C-Standard werden.
Zeile 5: Zeile 5:
Als funktionale Sprache arbeitet XQuery ohne Seiteneffekte. Das bedeutet, dass weder Daten dauerhaft oder auch nur temporär gespeichert, noch Inhalte modifiziert werden können.
Als funktionale Sprache arbeitet XQuery ohne Seiteneffekte. Das bedeutet, dass weder Daten dauerhaft oder auch nur temporär gespeichert, noch Inhalte modifiziert werden können.


= Sprachelemente =
== Sprachelemente ==


Die Navigation innerhalb der Dokumente erfolgt mit Hilfe von [http://www.w3.org/TR/xpath XPath]. Durch [[XPath]] kann jeder Knoten des durch das XML-Dokument erstellten Baums erreicht werden. Die in XPath vorhandenen Funktionen und elementaren Ausdrücke können ebenfalls verwendet werden. Man spricht deshalb von XPath als einer Untermenge von XQuery.
Die Navigation innerhalb der Dokumente erfolgt mit Hilfe von [http://www.w3.org/TR/xpath XPath]. Durch [[XPath]] kann jeder Knoten des durch das XML-Dokument erstellten Baums erreicht werden. Die in XPath vorhandenen Funktionen und elementaren Ausdrücke können ebenfalls verwendet werden. Man spricht deshalb von XPath als einer Untermenge von XQuery.


== Das FLWOR-Muster ==
=== Das FLWOR-Muster ===


Komplexere Ausdrücke werden nach dem '''FLWOR'''-Muster ('''f'''or-'''l'''et-'''w'''here-'''o'''rder-'''b'''y-'''r'''eturn) aufgebaut:
Komplexere Ausdrücke werden nach dem '''FLWOR'''-Muster ('''f'''or-'''l'''et-'''w'''here-'''o'''rder-'''b'''y-'''r'''eturn) aufgebaut:
 
<source lang="flwor">
'''for''' $var1 '''at''' $pos '''in''' <expr1>, ...
for $var1 at $pos in EXPR1, ...
'''let''' $var2 := <expr2>, ...
let $var2 :=         EXPR2, ...
'''where''' <bool>
where               EXPR3
'''order by''' <expr3> '''ascending/descending'''
order by             EXPR4 ascending/descending
'''return''' <expr4>
return               EXPR5
</source>


Entsprechend der SELECT-Anweisung in SQL kann auch in XQuery zur Abfrage der Daten eine Schleife ('''<code>for</code>''') durchlaufen werden. Das Element des jeweiligen Schleifenschritts wird dabei in einer Konstanten (<code>$var1</code>, s. o.) gespeichert, über die in den folgenden Anweisungen auf dessen Inhalt zugegriffen werden kann. In einer Konstanten (<code>$pos</code>) kann die Position des Elementes gespeichert und auf diese, beispielsweise in der where-Bedingung, zugegriffen werden (z.B. <code>where $posvar1 mod 2 = 0</code> bedeutet jeder 2te).
Entsprechend der SELECT-Anweisung in SQL kann auch in XQuery zur Abfrage der Daten eine Schleife ('''<code>for</code>''') durchlaufen werden. Das Element des jeweiligen Schleifenschritts wird dabei in einer Konstanten (<code>$var1</code>, s. o.) gespeichert, über die in den folgenden Anweisungen auf dessen Inhalt zugegriffen werden kann. In einer Konstanten (<code>$pos</code>) kann die Position des Elementes gespeichert und auf diese, beispielsweise in der where-Bedingung, zugegriffen werden (z.B. <code>where $posvar1 mod 2 = 0</code> bedeutet jeder 2te).


Im '''<code>let</code>'''-Abschnitt können Konstanten definiert, mit Werten belegt und Berechnungen durchgeführt werden. In jedem Schritt werden diese Konstanten neu definiert, ihr Inhalt wird also nicht über den Schleifenschritt hinaus gespeichert.  
Im <code>let</code>-Abschnitt können Konstanten definiert, mit Werten belegt und Berechnungen durchgeführt werden. In jedem Schritt werden diese Konstanten neu definiert, ihr Inhalt wird also nicht über den Schleifenschritt hinaus gespeichert.  


Es ist zudem möglich mehrere weitere '''<code>let</code>'''-Anweisungen vor dem Aufruf der for-Schleife(n) zu platzieren. Auf diese Daten kann während des gesamten Schleifendurchlaufs zugegriffen werden. Um Berechnungen mit Daten aus einer Abfrage auszuführen, müssen diese jedoch nach der Zuweisung für <code>$var1</code> durchgeführt werden.
Es ist zudem möglich mehrere weitere <code>let</code>-Anweisungen vor dem Aufruf der for-Schleife(n) zu platzieren. Auf diese Daten kann während des gesamten Schleifendurchlaufs zugegriffen werden. Um Berechnungen mit Daten aus einer Abfrage auszuführen, müssen diese jedoch nach der Zuweisung für <code>$var1</code> durchgeführt werden.


In der '''<code>where</code>'''-Bedingung wird jedes Element auf die angegebenen Kriterien geprüft. Hier können mehrere Bedingungen, die entweder mit '''<code>and</code>''' oder '''<code>or</code>''' verknüpft werden, angegeben werden. Im Gegensatz zu SQL können mit Xquery keine negativen Bedingungen (<code>not</code>) angegeben werden.
In der <code>where</code>-Bedingung wird jedes Element auf die angegebenen Kriterien geprüft. Hier können mehrere Bedingungen, die entweder mit <code>and</code> oder <code>or</code> verknüpft werden, angegeben werden. Im Gegensatz zu SQL können mit Xquery keine negativen Bedingungen (<code>not</code>) angegeben werden.


Erfüllt dieses die Bedingungen, so wird es in der '''<code>return</code>'''-Anweisung verarbeitet und alle gefundenen Daten nach dem '''<code>order</code>'''-'''<code>by</code>'''-Kriterium geordnet zurück gegeben.
Erfüllt dieses die Bedingungen, so wird es in der <code>return</code>-Anweisung verarbeitet und alle gefundenen Daten nach dem <code>order</code>-<code>by</code>-Kriterium geordnet zurück gegeben.


Im folgenden Beispiel werden aus einem XML-Dokument die Nach- und Vornamen aller Personen ausgewählt und als neues XML-Dokument ausgegeben.
Im folgenden Beispiel werden aus einem XML-Dokument die Nach- und Vornamen aller Personen ausgewählt und als neues XML-Dokument ausgegeben.


<person gender=“f“>
'''personen.xml'''
  <last>Mayr</last>
<source lang="flwor">
  <first>Ute</firste>
<personen>
</person>
  <person gender="f">
    <last>Mustermann</last> <first>Meike</firste>
  </person>
  <person gender="m">
    <last>Mustermann</last> <first>Max</firste>
  </person>
<personen>
</source>


<anreden>
'''xquery'''
{
<source lang="flwor">
for $person in  document(“personen.xml“)//person
<namen>
let $l:=string($person/last),
{
    $f:= string($person/first)
  for $person in  document("personen.xml")//person
return  
  let $l:=string($person/last),
  <anrede>{$l}{“ “}{$f}</anrede>
      $f:= string($person/first)
}
  return  
</anreden>
    <name>{$f}{" "}{$l}</name>
}
</namen>
</source>


<anreden>
'''Resultat'''
   <anrede>Mayr Ute</anrede>
<source lang="flwor">
  </anreden>
<namen>
  <name>Meike Musterfrau</name>
   <name>Max Musterman</name>
  </namen>
</source>


Die Konstanten in XQuery-Ausdrücken werden jeweils mit einem vorangehenden '''<code>$</code>'''-Zeichen gekennzeichnet.  
Die Konstanten in XQuery-Ausdrücken werden jeweils mit einem vorangehenden <code>$</code>-Zeichen gekennzeichnet.  


Den Konstanten, aber auch den Inhalten der Knoten, können explizit bestimmte Datentypen zugewiesen werden. Diese können als Bezeichner, zur Typüberprüfung oder auch für explizite Typecasts verwendet werden (Bsp.: <code>string($person/last)</code>).
Den Konstanten, aber auch den Inhalten der Knoten, können explizit bestimmte Datentypen zugewiesen werden. Diese können als Bezeichner, zur Typüberprüfung oder auch für explizite Typecasts verwendet werden (Bsp.: <code>string($person/last)</code>).


Bei der Rückgabe der Elemente muss jeder neue Knotentyp (Attribute, Elemente, Text, etc.) in geschweifte Klammern eingefasst werden. Ausschließlich XML-Tags können ohne diesen Rahmen ausgegeben werden. (z.B.: <code><anrede>{“Frau“}{$last}</anrede></code>) Hierbei muss man darauf achten, wiederum wohlgeformtes XML zu produzieren.
Bei der Rückgabe der Elemente muss jeder neue Knotentyp (Attribute, Elemente, Text, etc.) in geschweifte Klammern eingefasst werden. Ausschließlich XML-Tags können ohne diesen Rahmen ausgegeben werden. (z.B.: <code><name>{"Frau"} {$last}</name></code>) Hierbei muss man darauf achten, wiederum wohlgeformtes XML zu produzieren.


Beim Schreiben der where-Klauseln muss eine Besonderheit beachtet werden. Da im XML-Umfeld stets zwischen dem kompletten Knoten und dessen Inhalt unterschieden wird, werden auch hier unterschiedliche Vergleichsoperatoren angeboten.  
Beim Schreiben der where-Klauseln muss eine Besonderheit beachtet werden. Da im XML-Umfeld stets zwischen dem kompletten Knoten und dessen Inhalt unterschieden wird, werden auch hier unterschiedliche Vergleichsoperatoren angeboten.


== Vergleichsoperatoren ==
=== Vergleichsoperatoren ===


<dl>
<dt>
Operatoren für die Prüfung des Wertes eines Elements:  
Operatoren für die Prüfung des Wertes eines Elements:  
'''eq''' (equal), '''ne''' (not equal), '''lt''' (less than), '''le''' (less or equal), '''gt''' (greater than), '''ge''' (greater or equal)
<dd>
<code>eq</code> (equal), <code>ne</code> (not equal), <code>t</code> (less than), <code>le</code> (less or equal), <code>gt</code> (greater than), <code>ge</code> (greater or equal)


<dt>
Operatoren für die Prüfung der Existenz eines Elements:  
Operatoren für die Prüfung der Existenz eines Elements:  
'''=''', '''!=''', '''<''', '''<=''', '''>''', '''>='''
<dd>
<code>=</code>, <code>!=</code>, <code><</code>, <code><=</code>, <code>></code>, <code>>=</code>


<dt>
Operatoren für die Prüfung der Abfolge von Elementen:  
Operatoren für die Prüfung der Abfolge von Elementen:  
'''is''', '''<<''', '''>>'''
<dd>
<code>is</code>, <code><<</code>, <code>>></code>
</dl>


== Weitere Elemente ==
=== Weitere Elemente ===


Neben den bereits genannten FLWOR-Ausdrücken verfügt XQuery über weitere Elemente, die seine Funktionalität und Möglichkeiten erweitern. So können auch Listen (z.B.: <code>(1, 2, 4)</code>) oder Integerränge (z.B.: <code>1 to 3</code>, d. h. die Zahlen 1, 2 und 3) definiert werden.
Neben den bereits genannten FLWOR-Ausdrücken verfügt XQuery über weitere Elemente, die seine Funktionalität und Möglichkeiten erweitern. So können auch Listen (z.B.: <code>(1, 2, 4)</code>) oder Integerränge (z.B.: <code>1 to 3</code>, d. h. die Zahlen 1, 2 und 3) definiert werden.


Um mehrere Knotenfolgen zu kombinieren, können, wie in SQL auch, die Operatoren '''<code>union</code>''', '''<code>intersect</code>''' oder '''<code>except</code>''' verwendet werden. Die Auswertung der Knoten und ihres Inhalts anhand von Bedingungen ist in XQuery möglich. Hierzu kann das '''<code>if</code>'''-'''<code>then</code>'''-'''<code>else</code>'''-Konstrukt verwendet werden. Knotenmengen können auch anhand quantifizierender Ausdrücke überprüft werden ('''<code>some</code>'''-'''<code>in</code>'''-'''<code>satisfies</code>''', '''<code>every</code>'''-'''<code>in</code>'''-'''<code>satisfies</code>''').
Um mehrere Knotenfolgen zu kombinieren, können, wie in SQL auch, die Operatoren <code>union</code>, <code>intersect</code> oder <code>except</code> verwendet werden. Die Auswertung der Knoten und ihres Inhalts anhand von Bedingungen ist in XQuery möglich. Hierzu kann das <code>if</code>-<code>then</code>-<code>else</code>-Konstrukt verwendet werden. Knotenmengen können auch anhand quantifizierender Ausdrücke überprüft werden (<code>some</code>-<code>in</code>-<code>satisfies</code>, <code>every</code>-<code>in</code>-<code>satisfies</code>).


In XQuery können Kommentare, auch geschachtelt, verwendet werden. Diese werden jeweils durch einen Smilie eingeleitet und abgeschlossen (z.B.: <code>(: Kommentar :)</code>). Auch Kommentare im XML-Format sind erlaubt (z.B.: <code><!-- Kommentar --></code>).
In XQuery können Kommentare, auch geschachtelt, verwendet werden. Diese werden jeweils durch einen Smilie eingeleitet und abgeschlossen (z.B.: <code>(: Kommentar :)</code>). Auch Kommentare im XML-Format sind erlaubt (z.B.: <code><!-- Kommentar --></code>).


== Benutzerdefinierte Funktionen ==
=== Benutzerdefinierte Funktionen ===


In XQuery können XPath-Funktionen verwendet werden.  
In XQuery können XPath-Funktionen verwendet werden.  
Zeile 83: Zeile 106:
Ein Besonderheit, die XQuery bietet, ist jedoch die Möglichkeit zur Definition benutzerdefinierter Funktionen:
Ein Besonderheit, die XQuery bietet, ist jedoch die Möglichkeit zur Definition benutzerdefinierter Funktionen:


'''declare function''' namespace:function (para1 '''as''' type1, ...)
<source lang="flwor">
'''as''' ret
declare function namespace:function (para1 as type1, ...)
{  
as ret
  <expr>  
{  
}
  <expr>  
}
</source>


In diesen Funktionen können weitere Funktionen aufgerufen werden. Auch der rekursi-ve Aufruf von Funktionen ist an dieser Stelle möglich. Gerade die Möglichkeit zur Verwendung von Rekursion in den benutzerdefinierten Funktionen unterscheidet XQuery grundlegend von SQL.
In diesen Funktionen können weitere Funktionen aufgerufen werden. Auch der rekursive Aufruf von Funktionen ist an dieser Stelle möglich. Gerade die Möglichkeit zur Verwendung von Rekursion in den benutzerdefinierten Funktionen unterscheidet XQuery grundlegend von SQL.


Das folgende Beispiel gibt aus einem XML-Dokument, in dem Familienmitglieder über eine ID verknüpft sind, den Stammbaum aller Ottos aus. Dazu wird zuerst eine lokale benutzerdefinierte Funktion erstellt, die sich rekursiv selbst aufruft, bis keine Vorfahren mehr gefunden werden können. Diese Funktion kann anschließend unter Angabe ihres Namespaces beispielsweise aus einer for-Schleife aufgerufen werden.
Das folgende Beispiel gibt aus einem XML-Dokument, in dem Familienmitglieder über eine ID verknüpft sind, den Stammbaum aller Ottos aus. Dazu wird zuerst eine lokale benutzerdefinierte Funktion erstellt, die sich rekursiv selbst aufruft, bis keine Vorfahren mehr gefunden werden können. Diese Funktion kann anschließend unter Angabe ihres Namespaces beispielsweise aus einer for-Schleife aufgerufen werden.


declare function local:getfamilie($id as xs:string) as node()* {
<source lang="flwor">
declare function local:getfamilie($id as xs:string) as node()*  
{
   <mitglied>
   <mitglied>
     {document(“personen.xml“)//person[id=$id]/last}
     {document(“personen.xml“)//person[id=$id]/last}
     {document(“personen.xml“)//person[id=$id]/first}
     {document(“personen.xml“)//person[id=$id]/first}
     <mutter> {let $mid as xs:string := //person[id=$id]/mutter
     <mutter>  
              return if ($mid) then local:getfamilie(string($mid)) else ()
    { let $mid as xs:string := //person[id=$id]/mutter
     }</mutter>
        return if ($mid) then local:getfamilie(string($mid)) else ()
     <vater> {let $vid as xs:string := //person[id=$id]/vater
     }
              return if ($vid) then local:getfamilie(string($vid)) else ()
    </mutter>
     }</vater>
     <vater>  
    { let $vid as xs:string := //person[id=$id]/vater
        return if ($vid) then local:getfamilie(string($vid)) else ()
     }
    </vater>
   </mitglied>
   </mitglied>
};
}
for $e in document(“personen.xml“)//person[first="Otto"]
 
return <familie>{local:getfamilie(string($e/id))}</familie>
for $e in document(“personen.xml“)//person[first="Otto"]
  return <familie>{local:getfamilie(string($e/id))}</familie>
</source>
 
==Beispiele==
 
siehe [[XML_Query_Language/Beispiele]]


= Quellen =
== Quellen ==


* [http://www.w3.org/TR/xquery http://www.w3.org/TR/xquery]
* [http://www.w3.org/TR/xquery http://www.w3.org/TR/xquery]
* [http://www.w3.org/XML/Query http://www.w3.org/XML/Query]
* [http://www.w3.org/XML/Query http://www.w3.org/XML/Query]
* [http://www.w3schools.com/xquery/xquery_intro.asp http://www.w3schools.com/xquery/xquery_intro.asp]
* [http://www.w3schools.com/xquery/xquery_intro.asp http://www.w3schools.com/xquery/xquery_intro.asp]
* [http://www.jeckle.de/vorlesung/xml/script.html http://www.jeckle.de/vorlesung/xml/script.html]
* [http://www.mario-jeckle.de/vorlesung/xml/script.html http://www.jeckle.de/vorlesung/xml/script.html]
* [http://demo.exist-db.org/xquery/functions.xq http://demo.exist-db.org/xquery/functions.xq]
* [http://demo.exist-db.org/xquery/functions.xq http://demo.exist-db.org/xquery/functions.xq]
* [http://de.wikipedia.org/wiki/XQuery http://de.wikipedia.org/wiki/XQuery]
* [http://de.wikipedia.org/wiki/XQuery http://de.wikipedia.org/wiki/XQuery]

Aktuelle Version vom 17. Mai 2019, 14:46 Uhr

Definition

Die XML Query Language ist eine Abfragesprache für XML-Datenbanken und wird von der „XML Query Working Group“, einer Untergruppe der „XML Activity“ des W3C, entwickelt. Derzeit im Status „Working Draft“ soll XQuery bald zum W3C-Standard werden.

Als funktionale Sprache arbeitet XQuery ohne Seiteneffekte. Das bedeutet, dass weder Daten dauerhaft oder auch nur temporär gespeichert, noch Inhalte modifiziert werden können.

Sprachelemente

Die Navigation innerhalb der Dokumente erfolgt mit Hilfe von XPath. Durch XPath kann jeder Knoten des durch das XML-Dokument erstellten Baums erreicht werden. Die in XPath vorhandenen Funktionen und elementaren Ausdrücke können ebenfalls verwendet werden. Man spricht deshalb von XPath als einer Untermenge von XQuery.

Das FLWOR-Muster

Komplexere Ausdrücke werden nach dem FLWOR-Muster (for-let-where-order-by-return) aufgebaut:

for $var1 at $pos in EXPR1, ...
let $var2 :=         EXPR2, ...
where                EXPR3
order by             EXPR4 ascending/descending
return               EXPR5

Entsprechend der SELECT-Anweisung in SQL kann auch in XQuery zur Abfrage der Daten eine Schleife (for) durchlaufen werden. Das Element des jeweiligen Schleifenschritts wird dabei in einer Konstanten ($var1, s. o.) gespeichert, über die in den folgenden Anweisungen auf dessen Inhalt zugegriffen werden kann. In einer Konstanten ($pos) kann die Position des Elementes gespeichert und auf diese, beispielsweise in der where-Bedingung, zugegriffen werden (z.B. where $posvar1 mod 2 = 0 bedeutet jeder 2te).

Im let-Abschnitt können Konstanten definiert, mit Werten belegt und Berechnungen durchgeführt werden. In jedem Schritt werden diese Konstanten neu definiert, ihr Inhalt wird also nicht über den Schleifenschritt hinaus gespeichert.

Es ist zudem möglich mehrere weitere let-Anweisungen vor dem Aufruf der for-Schleife(n) zu platzieren. Auf diese Daten kann während des gesamten Schleifendurchlaufs zugegriffen werden. Um Berechnungen mit Daten aus einer Abfrage auszuführen, müssen diese jedoch nach der Zuweisung für $var1 durchgeführt werden.

In der where-Bedingung wird jedes Element auf die angegebenen Kriterien geprüft. Hier können mehrere Bedingungen, die entweder mit and oder or verknüpft werden, angegeben werden. Im Gegensatz zu SQL können mit Xquery keine negativen Bedingungen (not) angegeben werden.

Erfüllt dieses die Bedingungen, so wird es in der return-Anweisung verarbeitet und alle gefundenen Daten nach dem order-by-Kriterium geordnet zurück gegeben.

Im folgenden Beispiel werden aus einem XML-Dokument die Nach- und Vornamen aller Personen ausgewählt und als neues XML-Dokument ausgegeben.

personen.xml

<personen>
  <person gender="f">
    <last>Mustermann</last> <first>Meike</firste>
  </person>
  <person gender="m">
    <last>Mustermann</last> <first>Max</firste>
  </person>
<personen>

xquery

<namen>
{
   for $person in  document("personen.xml")//person
   let $l:=string($person/last),
       $f:= string($person/first)
   return 
     <name>{$f}{" "}{$l}</name>
}
</namen>

Resultat

<namen>
   <name>Meike Musterfrau</name>
   <name>Max Musterman</name>
 </namen>

Die Konstanten in XQuery-Ausdrücken werden jeweils mit einem vorangehenden $-Zeichen gekennzeichnet.

Den Konstanten, aber auch den Inhalten der Knoten, können explizit bestimmte Datentypen zugewiesen werden. Diese können als Bezeichner, zur Typüberprüfung oder auch für explizite Typecasts verwendet werden (Bsp.: string($person/last)).

Bei der Rückgabe der Elemente muss jeder neue Knotentyp (Attribute, Elemente, Text, etc.) in geschweifte Klammern eingefasst werden. Ausschließlich XML-Tags können ohne diesen Rahmen ausgegeben werden. (z.B.: <name>{"Frau"} {$last}</name>) Hierbei muss man darauf achten, wiederum wohlgeformtes XML zu produzieren.

Beim Schreiben der where-Klauseln muss eine Besonderheit beachtet werden. Da im XML-Umfeld stets zwischen dem kompletten Knoten und dessen Inhalt unterschieden wird, werden auch hier unterschiedliche Vergleichsoperatoren angeboten.

Vergleichsoperatoren

Operatoren für die Prüfung des Wertes eines Elements:
eq (equal), ne (not equal), t (less than), le (less or equal), gt (greater than), ge (greater or equal)
Operatoren für die Prüfung der Existenz eines Elements:
=, !=, <, <=, >, >=
Operatoren für die Prüfung der Abfolge von Elementen:
is, <<, >>

Weitere Elemente

Neben den bereits genannten FLWOR-Ausdrücken verfügt XQuery über weitere Elemente, die seine Funktionalität und Möglichkeiten erweitern. So können auch Listen (z.B.: (1, 2, 4)) oder Integerränge (z.B.: 1 to 3, d. h. die Zahlen 1, 2 und 3) definiert werden.

Um mehrere Knotenfolgen zu kombinieren, können, wie in SQL auch, die Operatoren union, intersect oder except verwendet werden. Die Auswertung der Knoten und ihres Inhalts anhand von Bedingungen ist in XQuery möglich. Hierzu kann das if-then-else-Konstrukt verwendet werden. Knotenmengen können auch anhand quantifizierender Ausdrücke überprüft werden (some-in-satisfies, every-in-satisfies).

In XQuery können Kommentare, auch geschachtelt, verwendet werden. Diese werden jeweils durch einen Smilie eingeleitet und abgeschlossen (z.B.: (: Kommentar :)). Auch Kommentare im XML-Format sind erlaubt (z.B.: ).

Benutzerdefinierte Funktionen

In XQuery können XPath-Funktionen verwendet werden.

Ein Besonderheit, die XQuery bietet, ist jedoch die Möglichkeit zur Definition benutzerdefinierter Funktionen:

declare function namespace:function (para1 as type1, ...)
as ret
{ 
  <expr> 
}

In diesen Funktionen können weitere Funktionen aufgerufen werden. Auch der rekursive Aufruf von Funktionen ist an dieser Stelle möglich. Gerade die Möglichkeit zur Verwendung von Rekursion in den benutzerdefinierten Funktionen unterscheidet XQuery grundlegend von SQL.

Das folgende Beispiel gibt aus einem XML-Dokument, in dem Familienmitglieder über eine ID verknüpft sind, den Stammbaum aller Ottos aus. Dazu wird zuerst eine lokale benutzerdefinierte Funktion erstellt, die sich rekursiv selbst aufruft, bis keine Vorfahren mehr gefunden werden können. Diese Funktion kann anschließend unter Angabe ihres Namespaces beispielsweise aus einer for-Schleife aufgerufen werden.

declare function local:getfamilie($id as xs:string) as node()* 
{
   <mitglied>
     {document(“personen.xml“)//person[id=$id]/last}
     {document(“personen.xml“)//person[id=$id]/first}
     <mutter> 
     {  let $mid as xs:string := //person[id=$id]/mutter
        return if ($mid) then local:getfamilie(string($mid)) else ()
     }
     </mutter>
     <vater> 
     {  let $vid as xs:string := //person[id=$id]/vater
        return if ($vid) then local:getfamilie(string($vid)) else ()
     }
     </vater>
   </mitglied>
}

for $e in document(“personen.xml“)//person[first="Otto"]
  return <familie>{local:getfamilie(string($e/id))}</familie>

Beispiele

siehe XML_Query_Language/Beispiele

Quellen


Dieser Artikel ist GlossarWiki-konform.
In diesem Artikel sollten die Quellenangaben überarbeitet werden.
Bitte die Regeln der GlossarWiki-Quellenformatierung beachten.