XQuery / XQuery: Arbeiten mit Namespaces und Funktionen

XQuery: Arbeiten mit Namespaces und Funktionen

XQuery: Arbeiten mit Namespaces und Funktionen

➪ Neben Standard-Namespaces sind in XQuery auch selbst definierte Namespaces von zentraler Bedeutung, etwa bei der Deklaration von Variablen und Funktionen.

Ähnlich wie in , gibt es auch in XQuery die Möglichkeit, eigene Funktionen samt Namespace zu implementieren und aufzurufen.


xquery version '3.0';
(: definiere einen Namespace :)
declare namespace 
    wg="http://www.wilfried-grupe.de/xquery/functions";
(: definiere eine Funktion mit zwei xs:nteger-Parametern, 
   Rueckgabetyp ist xs:integer :)
declare function wg:addiere 
                 ($a as xs:integer, $b as xs:integer) 
                 as xs:integer 
                 { $a + $b };
<ergebnis>
{ wg:addiere(4,5)}
</ergebnis>

Analog zu den anonymen Funktionen in können Sie auch XQuery-Variable als Funktionsaufrufe verwenden. Obwohl auch hier nicht zwingend erforderlich, ist die präzise empfehlenswert.


xquery version '3.0';
<ergebnis>{
let $addiere := function
                ($x as xs:integer, $y  as xs:integer) 
                as xs:integer 
                { $x + $y }
return $addiere(4,5)
}</ergebnis>

Das Ergebnis ist für beide Aufrufe gleich:


<ergebnis>9</ergebnis>

Es kommt häufiger vor, dass aus separaten XML-Dateien gezielt Werte ausgelesen und in andere Logiken übernommen werden müssen. Zu diesem Zweck habe ich hier ein XQuery-Beispiel, das neben einer speziellen Funktion auch die dazugehörigen Variablen und Namespaces enthält.


<Listen>
 <Liste Listnr="1">
  <Wert Key="2">3</Wert>
  <Wert Key="5">15</Wert>
  <Wert Key="15">450</Wert>
  <Default>0</Default>
 </Liste>
</Listen>

Die Funktion wg:getValue erhält zwei xs:string-Parameter: $listnumber und $key. Sie liest die externe XML-Datei $wg:externList ein, prüft dort, ob das Attribut Listnr mit dem Parameter $listnumber und ob ein Attribut Key mit dem Parameter $key übereinstimmen. Falls ja, wird der jeweilige Wert ermittelt; falls nein, wird auf Error oder Default geprüft.


(: definiere einen Namespace :)
declare namespace 
    wg="http://www.wilfried-grupe.de/xquery/functions";
(: definiere eine xs:string - Variable :)
declare variable $wg:document-uri 
as xs:string := "C:/wg/Listen.xml";
(: definiere eine Variable, 
die ein komplettes XML-Dokument einliest :)
declare variable $wg:externList 
as document-node() := doc($wg:document-uri);
(: definiere eine Function, 
die zwei xs:string-Parameter enthaelt 
und aus $wg:externList Werte einliest :)
declare function wg:getValue(
                 $listnumber as xs:string, 
                 $key as xs:string) {
if (exists( $wg:externList/Listen
                 /Liste[@Listnr = $listnumber]
                 /Wert[@Key = $key]) )
then (
        for $p in $wg:externList/Listen
                 /Liste[@Listnr = $listnumber]
                 /Wert[@Key = $key]
        return $p/text()
)
else if (exists( $wg:externList/Listen
                 /Liste[@Listnr = $listnumber]/Error) )
then (
        for $p in $wg:externList/Listen
                 /Liste[@Listnr = $listnumber]/Error
        return $p/text()
)
else (
        for $p in $wg:externList/Listen
                 /Liste[@Listnr = $listnumber]/Default
        return $p/text()
)
};

Der Einsatz dieser Funktion in XQuery mit den Parametern "1" und "15" ...


<wg:erg>
{wg:getValue("1", "15")}
</wg:erg>

... würde den Wert "450" ergeben, weil im eingelesenen XML-Dokument die Information <Wert Key="15">450</Wert> enthalten ist. Würde der Funktionsaufruf dagegen mit den Parametern "1" und "99" erfolgen,


<wg:erg>{wg:getValue("1", "99")}</wg:erg>

so wäre das Resultat "0", weil im XML-Dokument kein Key-Attribut den Wert "99" besitzt. Hier käme der dort definierte Default-Wert "0" zur Anwendung.


<wg:erg 
   xmlns:wg="http://www.wilfried-grupe.de/xquery/functions"
   >0</wg:erg>

wg / 30. April 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XQuery14.html