fn:resolve-QName
(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 5.)
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
Kategorie: Funktionen für QNames
Rückgabewert: Ein QName xs:QName in expandierter Form, der durch die Auflösung eines in Stringform xs:string vorliegenden, nicht expandierten QName-Kandidaten gegenüber den im Kontext des übergebenen Elements aktuell gültigen Namensraum-URIs gebildet wird.
Aufruf/Argumente:
fn:resolve-QName($qnamestring, $element)
$qnamestring:
Obligatorisch. Ein String xs:string, der lexikalisch einem nicht-expandierten QName entsprechen muss. Der String kann – muss jedoch nicht – einen durch Doppelpunkt abgeteilten Präfixanteil beinhalten.
$element:
Obligatorisch. Ein Element, dessen Namensraumknoten daraufhin überprüft werden, ob sie an ein Präfix gebunden sind, der dem im QNamestring enthaltenen Präfixteil entspricht.
Verwendungszweck:
Die Funktion fn:resolve-QName() stellt einen Konstruktor für einen QName xs:QName in dessen expandierter Form dar und verwendet als Eingangswerte einen String, der den nicht expandierten QName-Kandidaten enthält, sowie ein Bezugselement zur Bestimmung des zu verwendenden Namensraums.
Besitzt der QName-Kandidat nicht die geforderte lexikalische Form, so wird der Fehler »Invalid lexical value« (err:FOCA0002) gemeldet. Wird als QName-Kandidat hingegen die leere Sequenz übergeben, so gibt die Funktion eine leere Ergebnissequenz aus, ohne einen Fehler zu melden.
Die Namensraumknoten des Bezugselements (genauer: alle sich in dessen Scope befindenden Namensräume) werden daraufhin überprüft, ob einer von ihnen an ein Präfix gebunden ist, das dem Präfixteil des übergebenen QNamestrings gleicht.
Wird ein solcher Namensraum gefunden, so wird dessen Namensraum-URI zusammen mit dem lokalen Namensteil des übergebenen QNamestrings als expandierter QName ausgegeben und entsprechend als xs:QName typisiert.
Besitzt der QNamestring keinen Präfixanteil, so wird der Scope des Elements nach einem Default-Namensraum (der an kein Präfix gebunden ist) untersucht, und – falls ein solcher existiert – dieser zusammen mit dem lokalen Namensanteil des QNamestring als expandierter QName xs:QName ausgegeben.
Besitzt der QNamestring keinen Präfixanteil und ist das Element nicht im Default-Namensraum, so wird ein QName xs:QName ohne Namensraumanteil ausgegeben.
Dagegen ist es ein Fehler (»No namespace found for prefix«, err:FONS0004), wenn der QNamestring einen Präfixanteil besitzt, aber das Bezugselement keinen Namensraum besitzt, der an ein entsprechendes Präfix gebunden ist
Die Funktion kann auch eingesetzt werden, falls ein präfixloser, expandierter QName xs:QName erzeugt werden soll, ohne auf den Default-Namensraum zuzugreifen. Hier besteht die Schwierigkeit, dass dieser (wenn deklariert) für das Bezugselement in der Regel gültig ist. Deshalb muss sichergestellt werden, dass die Funktion fn:resolve-QName() in diesem Fall nicht angewendet wird, sondern alternativ die Funktion fn:expanded-QName().
Dies ist mittels des folgenden XPath-Ausdrucks möglich, der anhand des Aufbaus des zu verwendenden QNamestrings $qnamestring prüft, ob dieser einen Präfixanteil enthält oder nicht:
if(contains($qnamestring, ":")
then
fn:resolve-QName($qnamestring, $element)
else
fn:expanded-QName((), $qnamestring)
Ist ein Präfixanteil enthalten, so findet fn:contains() den Doppelpunkt und der erste Zweig der Bedingung wird eingeschlagen – in diesem Fall kann fn:resolve-QName() wie oben beschrieben verwendet werden, da nicht die Gefahr besteht, dass ein präfixloser QName-Kandidat den resultierenden QName an den Default-Namensraum bindet (was ja genau vermieden werden soll).
Andernfalls ist die Bedingung nicht erfüllt. Im else-Zweig wird die Funktion fn:expanded-QName() mit dem leeren String als erstem Argument und dem (bewiesen präfixlosen) QNamestring als zweitem Argument ausgeführt. Rückgabewert ist in diesem Fall wie gewünscht ein expandierter QName, der im Null-Namensraum, also in keinem Namensraum ist.
Alternativ kann die Konstruktorfunktion für QNames eingesetzt werden, wenn die Namensräume des statischen Kontextes verwendet werden dürfen:
xs:QName($qnamestring)
Beispiele:
Beispiel 1 – Erzeugung eines QNames ohne Namensraum:
Das Bezugselement <test> besitzt beliebige präfixgebundene Namensraumknoten. Der präfixlose Default-Namensraum ist jedoch nicht im Scope. Folgender Aufruf
fn:resolve-QName("mein_name", test)
gibt einen expandierten QName mein_name zurück, der in keinem Namensraum ist (das ist nicht der Fall, wenn der Default-Namensraum im Scope des Bezugselements ist, siehe Beispiel 3).
Beispiel 2 – Erzeugung eines QNames mit Namensraum:
Das Bezugselement <test> besitzt unter anderem einen Namensraumknoten, der an das Präfix beispiel: gebunden ist. Folgender Aufruf
fn:resolve-QName("beispiel:dein_name", test)
gibt einen expandierten QName dein_name zurück, der an den durch das Präfix beispiel: für das Bezugselement bezeichneten Namensraum gebunden ist.
Beispiel 3 – Erzeugung eines QNames im Default-Namensraum:
Das Bezugselement <defaulttest> hat im Scope beliebige Namensräume, darunter auch den Default-Namensraum. Folgender Aufruf
fn:resolve-QName("sein_name", defaulttest)
gibt einen expandierten QName sein_name zurück, der im Default-Namensraum ist, da dies der Namensraum ist, der für das Bezugselement dem leeren String (als Präfix) zugeordnet ist.
Funktionsdefinition:
XPath 1.0:
Funktion nicht verfügbar
fn:resolve-QName($qname as xs:string?,
$element as element()) as xs:QName?
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |
Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
Galileo Press, Rheinwerkallee 4, 53227 Bonn