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

Funktionen auf Knoten

Auf den Namen eines Knotens kann man mit den XQuery-Funktionen fn:node-name() und fn:name() zugreifen. Wenn der Knoten keinen Namen hat (Dokument-, Kommentar- oder Textknoten), wird eine leere Zeichenkette geliefert, sonst der Name. Bei Verarbeitungsanweisungen besteht der Name aus dem Ziel der Verarbeitungsanweisung. Bei Attributen und Elementen kann der Name aus einem Namensraum stammen.

fn:node-name() liefert den Namen als expandierten QName, so dass sich die Frage nach einem Namensraumpräfix nicht stellt. fn:name() hingegen liefert einen String in der syntaktischen Form eines QName, so dass ein Namensraumpräfix benutzt werden muss. Wenn ein solches Präfix im Kontext des Element- oder Attributknotens definiert ist, wird es auch benutzt, sonst generiert die XQuery-Implementierung ein eindeutiges Präfix.

Oft ist es jedoch sinnvoll, auf die beiden Bestandteile eines Namens (den Namensraum in Form einer URI und den "lokalen" Namen) separat zuzugreifen. Hierfür gibt es die Funktionen fn:local-name() und fn:namespace-uri(). Die folgende Tabelle zeigt einige Beispiele für das Zusammenspiel dieser Funktionen.

$knode-name($k)name($k)local-name($k) namespace-uri($k)
<A/>AAA
<y:A xmlns:y="http://x"/>"http://x:A"y:AA"http://x"
<A xmlns="http://x"/> "http://x:A"AA"http://x"
attribute a {1}aaa
<!-- Kommentar -->
<?do nix?>dododo

Tab. Beispiele für die Ergebnisse der Namensfunktionen

Die einem Knoten zugeordnete Wurzel des Knotenbaumes kann mit der Funktion fn:root() adressiert werden. Stammt der Knoten, der als Argument übergeben wird, aus einem XML-Dokument, dann liefert der Funktionsaufruf einen Dokumentknoten. Im folgenden Beispiel liefert die Funktion jedoch den Knoten selbst, weil er die Wurzel des Knotenbaumes darstellt:

fn:root(<Arzt/>)

Auf den textuellen Wert eines Knotens kann man mit der Funktion fn:string() zugreifen, auf den getypten Wert mittels der Funktion fn:data(). Diese liefert je nach Knotenart auch eine Sequenz aus mehr als einem Wert.

fn:string(<Name>
<Vorname>Daniela</Vorname>
<Nachname>Baumann</Nachname>
</Name>)

liefert DanielaBaumann als Wert vom Typ xs:string.

fn:data(<Geburtsdatum>1982-07-23</Geburtsdatum>)

liefert, eine entsprechende Schemadefinition vorausgesetzt, einen Wert vom Typ xs:date.

Eine spezielle Funktion zur Behandlung numerischer Daten ist fn:number(). Diese Funktion erzeugt aus einem Knoten einen Wert des Typs xs:double. Von der Konstruktorfunktion xs:double unterscheidet sie sich nur in Grenzfällen. Während xs:double() einen Fehler meldet, wenn das Argument eine leere Sequenz ist oder nicht dem Repräsentationsraum von xs:double entstammt, liefert fn:number in diesen Fällen den Wert NaN. Es gilt also

fn:number(<A><B>1</B><C>2</C></A>) = 12.0

weil der textuelle Wert von <A><B>1</B><C>2</C></A> nämlich 12 ist, während der folgende Ausdruck NaN ergibt:

fn:number(<A><B>1.0</B><C>2.0</C></A>)

 

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

<< zurückvor >>