Gleichheit von Sequenzen
Auf Sequenzen ist keine Ordnungsrelation definiert. Es ist aber möglich, zwei Sequenzen auf Gleichheit zu prüfen. Hierzu steht die Funktion fn:deep-equal() zur Verfügung. Da Sequenzen heterogen sein können, ist die Definition der Gleichheit recht umfangreich.
Damit Sequenzen gleich sind, müssen sie dieselbe Anzahl von Einträgen haben, und die Einträge an derselben Position jeder Sequenz müssen paarweise gleich sein. Damit ist die leere Sequenz gleich der leeren Sequenz. Für andere Sequenzen muss definiert werden, wann zwei Einträge gleich sind:
Sind beide Einträge atomare Werte, so ist Gleichheit über den Operator eq definiert. Bei diesem Operator spielen Sortierordnungen eine Rolle; daher kann man der Funktion fn:deep-equal() explizit eine Sortierordnung mitgeben. Ist einer der beiden Einträge ein atomarer Wert und der andere ein Knoten, dann sind sie nicht gleich. Die Gleichheit von Knoten zueinander ist rekursiv definiert:
- Die Art der Knoten muss gleich sein (z. B. Attributknoten).
- Wenn die Knoten Namen haben, so müssen die Namen gleich sein.
- Wenn es sich um Attributknoten handelt, müssen Name und getypter Wert gleich sein.
- Bei Text-, Namensraum- und Kommentarknoten muss der textuelle Wert gleich sein.
- Bei Knoten für Verarbeitungsanweisungen müssen Name und textueller Wert gleich sein.
- Wenn es sich um Elementknoten handelt, so muss für beide Knoten gelten, dass es für jedes Attribut in dem einen Knoten ein Attribut in dem anderen Knoten gibt, so dass diese Attributknoten gleich sind.
- Wenn beide Elementknoten einen einfachen Typ haben, muss der getypte Wert gleich sein.
- Wenn ein Elementknoten einen einfachen Typ hat und der andere nicht, dann sind sie nicht gleich.
- Wenn beide Elementknoten einen komplexen, möglicherweise gemischten Inhalt haben, dann sind sie gleich, wenn ihre Kindknoten (unter Vernachlässigung von Kommentarknoten und Knoten für Verarbeitungsanweisungen) paarweise gleich sind, also wenn für die beiden Elementknoten $e1 und $e2 gilt:
fn:deep-equal($e1/(* | text()), $e2/(* | text()), $collation)
Es ist somit nicht gefordert, dass bei Elementen oder Attributen der Typ identisch sein muss, oder dass die Knoten aus demselben Kontext stammen. Knoten für Verarbeitungsanweisungen und Kommentarknoten werden offensichtlich nur berücksichtigt, wenn sie auf der obersten Ebene des Aufrufs von fn:deep-equal() auftreten.
Signatur | Beschreibung |
---|---|
fn:deep-equal( $seq1 as item()*, $seq2 as item()*[, $collation as string]) as xs:boolean | liefert true, wenn die beiden Eingabesequenzen unter Berücksichtigung der Sortierordnung gleich sind. |
Tab. Gleichheit von Sequenzen
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |