Knotenvergleich
Die dritte Klasse an Vergleichsausdrücken bezieht sich auf die Überprüfung von Knoten, wobei sowohl der Test auf Identität (versus Gleichheit durch den =-Operator als Wertegleichheit) als auch die Überprüfung auf relative Positionierung einzelner Knoten in einer Sequenz darunterfallen. Voraussetzung für einen erfolgreich durchgeführten Vergleich ist, dass jeder Operand entweder eine leere Sequenz ist oder aus genau einem Element besteht. Im ersten Fall ist das Ergebnis eines Knotenvergleichs wiederum eine leere Sequenz. Andernfalls hängt das Ergebnis vom Operator ab:
Überprüfung auf Identität
Der is-Operator liefert true, falls beide Operatoren auf den gleichen Knoten verweisen. Anwendung findet der Knotenvergleich mit Identitätsprüfung in Fällen mit mehreren Selektionen. Zum Beispiel soll überprüft werden, ob der Arzt "Paul König" der betreuende Arzt des stationären Patienten mit der Patientennummer "pat_res_01001" ist. Beide Einschränkungen müssen auf den gleichen Knoten verweisen:
fn:collection("Patienten")
//Patient_stationär[@ID="pat_res_01001"]/
xqb:follow-xlink(./Arzt/@xlink:href)
is
fn:doc("Hochwaldklinik.xml")
//Arzt[Nachname = "König" and Vorname = "Paul"]
Für einen Test auf Ungleichheit eines Knotens existiert kein eigener Operator, so dass auf die Negation mit Hilfe der fn:not()-Funktion zurückgegriffen werden muss.
Vergleich der relativen Positionierung
Die Operatoren << oder >> dienen dazu, zwei Knoten bezüglich ihrer Positionierung in der Dokumentordnung zu vergleichen. Der <<-Operator liefert true genau dann, wenn der erste Operandenknoten dem zweiten Operandenknoten vorausgeht. Der >>-Operator ist analog mit Vertauschung der Operanden definiert. Zur Illustration soll ein Arztbericht erstellt werden, der für den Patienten mit der Kennung pat_res_010001 alle Vorgänge vor der jeweils ersten Transplantation für jede Operation des Patienten liefert.
<Operationsvorgänge>
{
let $p := fn:collection("Patienten")
//Patient_stationär[@ID="pat_res_010001"]
(: Iteration über alle Operationen mit Transplantationen :)
for $o in $p//Operation[Transplantation]
return
<Operation>
{
$o/Beschreibung,
for $v in $o/*
where $v << ($o/Transplantation[1])
return
<Vorgang>{ fn:node-name($v) }</Vorgang>
}
</Operation>
}
</Operationsvorgänge>
Im Zusammenhang mit dem Vergleich der relativen Positionierung bilden Positionsangaben innerhalb der Pfadausdrücke ein mächtiges Konstrukt zur Formulierung komplexer ordnungsbezogener Anfragen. So soll beispielsweise ein Arztbericht mit allen Vorgängen erstellt werden, die zwischen der ersten und der vorletzten Injektion der ersten Operation durchgeführt worden sind:
<KritischeOperationsvorgänge>
{
let $p := fn:collection("Patienten")
//Patient_stationär[@ID="pat_res_010001"]
let $o := $p//Operation[1]
for $v in $o/*
where $v >> $o/Injektion[1] and $v << $o/Injektion[fn:last()-1]
return $v
}
</KritischeOperationsvorgänge>
Die where-Klausel filtert dabei alle Vorgänge während einer Operation ($v), die nach der ersten und vor der vorletzten Injektion der ersten Operation durchgeführt worden sind. Zur Ermittlung der Position des letzten Eingriffs wird auf die Funktion fn:last() zurückgegriffen.
Zuletzt sei nochmals auf den Unterschied zwischen Wertevergleich und Knotenvergleich am Beispiel konstruierter Knoten eingegangen. Folgender Ausdruck
<Text>bla bla</Text> = <Text>bla bla</Text>
mit einem Wertevergleich wird zu true evaluiert, da der Wert der beiden Operanden dem Gleichheitsoperator genügt. Wird der Gleichheitsoperator durch den Identitätsoperator ersetzt, so liefert der dadurch entstandene Knotenvergleich false:
<Text>bla bla</Text> is <Text>bla bla</Text>
Der Grund dafür liegt darin, dass der linke und der rechte Operator durch zwei unterschiedliche Knoten repräsentiert werden und dadurch der Knotenvergleich entsprechend negativ ausfällt.
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |