XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XQuery / 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 xsl:function, 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="https://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 XSL können Sie auch XQuery-Variable als Funktionsaufrufe verwenden. Obwohl auch hier nicht zwingend erforderlich, ist die präzise Datentypkontrolle 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="https://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="https://www.wilfried-grupe.de/xquery/functions"
>0</wg:erg>
wg / 2. Mai 2021
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de