• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Verfolgung von XLink

XQuery stellt selbst keine Sprachmittel für eine Verfolgung von XLink-Angaben zur Verfügung. In den vorangegangenen Beispielen wurde dabei auf eine benutzerdefinierte Funktion zurückgegriffen. Diese Funktion wird im Folgenden auf zwei unterschiedliche Arten realisiert.

Beide Varianten haben dabei identische Signaturen und erwarten eine Zeichenkette mit dem Locator-Attribut eines XLink-Elementes als Parameter und liefern ein beliebiges Element zurück, welches das Ziel des XLink in dem entsprechenden Dokument repräsentiert. In einem ersten Schritt wird dieser Teil des XLink-Elementes syntaktisch mit Hilfe der Funktionen zur Bearbeitung und Analyse von Zeichenketten in seine Komponenten zerlegt. Die Variable $docValue repräsentiert dabei die URI für das zugrunde liegende XML-Dokument und $idValue enthält das Ziel des XLink zur Identifikation des entsprechenden Elementes.

declare namespace xqb="http://www.xquerybuch.de";
declare function xqb:follow-xlink(
$href as xs:string)
as element
{
let $docValue := fn:substring-before($href, "#")
let $x := fn:substring-after($href, "#xpointer(id(""")
let $idValue := fn:substring-before($x, """)")
return
(: Kontrolle, ob es sich um eine gültige Syntax handelt :)
if ( fn:matches($href, "[^#]*#xpointer\(id\([^(]*\)\)") ) then
fn:doc($docValue)/fn:id($idValue)
else
fn:error("XPointer-Syntax nicht unterstützt!")
};

Die erste Variante basiert auf den beiden Funktionen fn:doc() und fn:id() zum Zugriff auf ein externes XML-Dokument bzw. der Auflösung von Referenzen. Wird in diesem Fall kein über den ID-Wert zu referenzierendes Element gefunden, so liefert diese Variante keinen Fehler, sondern ein leeres Ergebnis zurück. In der zweiten Variante wird dieser Fehlerfall explizit abgefangen. Dabei wird nach dem Zugriff auf die externe XML-Dokumentenressource mit Hilfe der Funktion fn:doc() eine Filterung über einen angefügten Pfadausdruck realisiert.

Die Variable $result enthält alle Elemente in dem Dokument, deren Attribut ID mit dem vorgegebenen Wert der Referenz übereinstimmt. Falls diese Variable den Wert einer leeren Sequenz nach der Bindung enthält, kann festgestellt werden, dass es sich zwar um einen syntaktisch korrekten, jedoch nicht gültigen XLink-Eintrag gehandelt hat:

declare namespace xqb="http://www.xquery-buch.de";
declare function xqb:follow-xlink(
$href as xs:string)
as element
{
let $docValue := fn:substring-before($href, "#")
let $x := fn:substring-after($href, "#xpointer(id(""")
let $idValues := fn:substring-before($x, """)")
return
if ( fn:matches($href,"[^#]*#xpointer\(id\([^(]*\)\)") ) then
let $result := fn:doc($docValue)/fn:id($idValue)
return
if ($result) then
$result
else
fn:error("XLink nicht aufgelöst!")
else
fn:error("XPointer-Syntax nicht unterstützt!")
};

 

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>