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

Herkunft: XPath 2.0

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 darauf­hin überprüft werden, ob sie an ein Präfix gebunden sind, der dem im QName­string 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 verwen­denden 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 QName­strings 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 Namensan­teil 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 QName­­string 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 Auf­baus 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ück­gabewert 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 Namens­­raumknoten. 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 Namens­raum 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, dar­unter auch den Default-Namensraum. Folgender Aufruf

fn:resolve-QName("sein_name", defaulttest)

gibt einen expandierten QName sein_name zurück, der im Default-Namens­raum 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

XPath 2.0:

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