Die Prädikatauswertung
Die folgenden Seiten stammen aus dem Buch "XQuery – Grundlagen und fortgeschrittene Methoden". Zur Erklärung der vorgestellten XPath-Ausdrücke dient die Datei "Hochwaldklinik.xml" als durchgängiges Beispielszenario. Sie veranschaulicht die Verwaltung eines Krankenhauses mit all seinen Einrichtungen, Mitarbeitern und Patienten.
Prädikatauswertung über Kontextpositionen
Handelt es sich bei dem Prädikatausdruck um einen atomaren Wert eines numerischen Datentyps, so wird der Ausdruck zu true evaluiert, falls die Positionsangabe des Elementes dem numerischen Wert des Prädikates entspricht. Im Beispielszenario der Datei "Hochwaldklinik.xml" liefert folgender Lokalisierungsschritt den Eintrag der dritten Operation, falls der Kontextknoten auf einen Patienten verweist:
child::Operation[3]
Prädikatauswertung über Bestimmung des effektiven booleschen Wertes
Für alle anderen Ausdrücke, die ein Prädikat formulieren, wird für jeden Knoten der effektive boolesche Wert bestimmt und der Knoten in das Ergebnis übernommen, falls sich der Wert zu true ergibt. Interessanterweise kann als Prädikat jeder XQuery-Ausdruck Verwendung finden, wobei häufig Pfadausdrücke und Funktionen auf Sequenzen eingesetzt werden.
Wird ein Prädikat in einem Lokalisierungsschritt durch einen Pfadausdruck spezifiziert, so wird der Pfadausdruck mit dem aktuell zu überprüfenden Knoten als Kontextknoten ausgewertet. Der im Folgenden aufgeführte Lokalisierungsschritt mit einer Filterbedingung bezüglich der Rolle des Arztes kann als erstes Beispiel dienen:
child::Arzt[attribute::Rolle = "Assistent"]
child::Arzt[@Rolle = "Assistent"]
Für jeden Arzt wird die attribute::-Achse (implizit gegeben durch die Abkürzung über das @-Symbol) nach Attributen mit der Bezeichnung Rolle durchsucht und der Wert mit der entsprechenden Zeichenkette verglichen. Der effektive boolesche Wert ergibt sich durch den Vergleich mit der Zeichenkette. Pfadausdrücke in Prädikaten von Lokalisierungsschritten können ebenfalls zum Test auf Existenz von Attributen oder Elementen aus Sicht des aktuell zu bearbeitenden Knotens herangezogen werden. Zum Beispiel wird im Folgenden der Arztknoten nur dann in das Ergebnis des aktuellen Lokalisierungsschrittes aufgenommen, wenn ein Attribut Rolle existiert:
child::Arzt[@Rolle]
Analog kann die Prüfung auf die Existenz eines Elementes sowohl als relativer als auch absoluter Pfadausdruck überprüft werden. So werden im folgenden Beispiel Arztknoten (als Kinder des Kontextknotens) nur dann in das Ergebnis des Lokalisierungsschrittes übernommen, wenn in dem jeweiligen Vorgang ein Anästhesie-Eintrag existiert:
child::Arzt[parent::*/child::Anästhesie]
child::Arzt[../Anästhesie]
Die Überprüfung auf Existenz eines Elementes tritt sehr häufig bei der Formulierung von Anfragen auf und kann auch durch Verwendung von Achsen und der sukzessiven Auswertung von Lokalisierungsschritten simuliert werden. So liefert der folgende Pfadausdruck alle Knoten mit der Bezeichnung PLZ von Adressen stationärer Patienten, wobei zusätzlich gelten muss, dass ein Knoten mit der Bezeichnung "Name" parallel zu dem Knoten mit der Bezeichnung "Adresse" existiert.
/Patient/Patient_stationär/Name/parent::*/Adresse/PLZ
/Patient/Patient_stationär/Name/../Adresse/PLZ
Dieser "Umweg" über den Knoten "Name" realisiert einen Existenztest, da Knoten mit der Bezeichnung "Adresse" nur ausgehend von den Ergebnissen der vorangegangenen Lokalisierungsschritte gefunden werden können. Besitzt ein stationärer Patient keinen Namensknoten, so ist das Ergebnis des entsprechenden Lokalisierungsschrittes eine leere Knotensequenz und die zugehörigen Adressinformationen können in den nachfolgenden Schritten nicht aufgefunden werden.
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |