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

Ausdrücke auf Sequenzen

Alternativ zu Pfadausdrücken werden häufig Ausdrücke auf Sequenzen verwendet, um eine Filterung zu realisieren.

SignaturBeschreibung
fn:position()
as xs:integer
liefert die aktuelle Position des Kontextknotens innerhalb der aktuell zu bearbeitenden Knotensequenz
fn:last()
as xs:integer
liefert die Anzahl der Knoten innerhalb der aktuell zu bearbeitenden Knotensequenz

Die Überprüfung der Position bezieht sich dabei auf den Zustand des dynamischen Kontexts und kann durch die Funktion fn:position() erfolgen, so dass die beiden folgenden Ausdrücke äquivalent sind:

child::Operation[3]
child::Operation[fn:position() = 3]

Die Verwendung von Funktionen ermöglicht jedoch die Formulierung mächtiger Prädikate, zum Beispiel die Selektion der beiden ersten und beiden letzten Operationen eines Patienten:

child::Operation[fn:position() < 3 or fn:position() > fn:last()-2]

Die Funktion fn:last() gibt dabei die Position des letzten Knotens in der aktuell bearbeiteten Sequenz an.

Häufig findet auch ein Test bzgl. einer Liste von Positionen Anwendung. Zum Beispiel reduziert das folgende Prädikat die Menge der Kindknoten auf die erste, dritte bis fünfte und vorletzte Operation:

child::Operation[fn:position() = (1, 3 to 5, fn:last()-1)]

Zu beachten ist an dieser Stelle, dass – entgegen früheren Versionen der XQuery-Spezifikation – kein impliziter Vergleichstest der Ordinalzahl existiert. Der folgende Ausdruck leistet in der aktuellen Fassung der Spezifikation nicht mehr das Geforderte:

child::Operation[(1, 3 to 5, fn:last()-1)]

Durch die Bestimmung des booleschen Wertes der Sequenz atomarer Werte ist dieser Ausdruck äquivalent zu:

child::Operation[true]

Kombination von Prädikaten

Ein Lokalisierungsschritt kann im Allgemeinen entweder gar kein Prädikat, ein einzelnes Prädikat oder eine Liste von Prädikaten aufweisen, die sukzessive abgearbeitet werden. Die Reihenfolge der Auswertung der Attribute ist dabei nicht zu vernachlässigen, da die Auswertung des n-ten Prädikates sich auf das Ergebnis der Auswertung des n-1-ten Prädikates bezieht. Verdeutlicht sei dies an folgendem Beispiel:

/Patient//Operation[Transplantation][fn:position() = (1 to 5)]
/Patient//Operation[fn:position() = (1 to 5)][Transplantation]

Während der erste Ausdruck die ersten fünf Operationen mit einer Transplantation zurückliefert, werden im zweiten Ausdruck grundsätzlich nur die ersten fünf Operationen berücksichtigt, die dann zusätzlich eine Transplantation enthalten müssen, um in das Ergebnis übernommen zu werden.

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

<< zurückvor >>