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

Vergleich von Zeichenketten

Für den Vergleich von Zeichenketten in XQuery steht eine einzelne Funktion fn:compare() – siehe Tabelle – zur Verfügung, die alle Operatoren wie eq, le, ... für einen Wertevergleich zwischen zwei Stringwerten realisiert.

SignaturBeschreibung
fn:compare(
$comparand1 as xs:string?,
$comparand2 as xs:string?[,
$collation as xs:string])
as xs:integer?
vergleicht die beiden Zeichenketten
(hinsichtlich einer explizit angegebenen
Sortierordnung):
= 0: $comparand1 eq $comparand2
= –1 : $comparand1 lt $comparand2
= +1 : $comparand1 gt $comparand2

Tab. Funktion zum Vergleich von Zeichenketten

Das numerische Ergebnis der Vergleichsfunktion ist 0, falls beide Zeichenketten identisch sind, und -1 bzw. +1, falls der Wert des ersten Operanden vor bzw. hinter dem zweiten Operanden hinsichtlich einer Sortierordnung positioniert wird. Das grundsätzliche Prinzip verdeutlichen folgende Beispiele:

fn:compare('XQuery', 'XQuery') liefert 0

fn:compare('XQuery', 'XQuery und XML') liefert -1,
d. h. 'XQuery' lt 'XQuery und XML'

fn:compare('XQuery', '') liefert +1,
d. h. 'XQuery' gt ''

Eigentlich interessant wird der Vergleich von Zeichenketten jedoch erst dann, wenn das Konzept einer expliziten Sortierordnung ("collation") berücksichtigt wird. Die Sortierordnung kann von der Anwendung angegeben werden und legt die spezifische Ordnung auf Zeichenketten fest. Neben der Verwendung in Funktionen zur Analyse und Manipulation von Zeichenketten findet sich das Prinzip der Sortierordnung in der order by-Klausel von FLWOR-Ausdrücken wieder.

Im statischen Kontext einer XQuery-Auswertung existiert eine Standard-Sortierordnung, deren Bezeichnung mit der Funktion fn:default-collation() in Erfahrung gebracht werden kann. Ist explizit eine Sortierordnung beispielsweise bei der Vergleichsfunktion fn:compare() angegeben, so wird diese vom XQuery-Prozessor verwendet. Ein Laufzeitfehler vom Typ "unsupported collation" zeigt dabei an, dass die geforderte Strategie vom System nicht unterstützt wird. Falls eine Sortierordnung nicht explizit von der Anwendung gefordert wird, so wird die im statischen Kontext existierende Sortierordnung verwendet. XQuery erlaubt dabei das Setzen der standardmäßig referenzierten Sortierordnung im Anfrageprolog bzw. greift auf die standardmäßig existierende Unicode-Codepoint-Sortierordnung zurück.

Im Deutschen sind zwei Sortierordnungen gebräuchlich: diejenige, die im Telefonbuch Verwendung findet, und diejenige, die in Wörterbüchern eingesetzt wird. Sie unterscheiden sich in der Behandlung der Umlaute: Im Wörterbuch wird ein Umlaut wie der entsprechende Grundbuchstabe behandelt ("ä" wie a"), im Telefonbuch wie die aus Kreuzworträtseln bekannte Umschreibung ("ä" wie ae"). Nach der Wörterbuchsortierung gilt somit "Äpfel=Apfel", nach der Telefonbuchsortierung ist "Äpfel (im Sinne von Aepfel) < Apfel". In beiden Sortierordnungen wird "ß" wie "ss" behandelt. Am Beispiel der Vergleichsfunktion von zwei Zeichenketten sei dies verdeutlicht, wobei der erste Ausdruck den Wert 0, der zweite Ausdruck den Wert -1 zurückliefern würde. Der Parameter zur Sortierordnung ist vom Typ xs:string, muss aber als xs:anyURIinterpretierbar sein:

(: Ausdruck 1 :)
fn:compare('Äpfel', 'Apfel'
'http://www.xquery-buch.de/Wörterbuchordnung')

(: Ausdruck 2 :)
fn:compare('Äpfel', 'Apfel',
'http://www.xquery-buch.de/Telefonbuchordnung')

Somit kann eine Sortierordnung benutzt werden, um Operationen auf Zeichenketten an die jeweilige Sprache anzupassen. So wird im Schwedischen beispielsweise ein "Ö" hinter einem Z sortiert. Eine Sortierordnung kann darüber hinaus aber auch benutzt werden, um die Klein-/Großschreibung zu ignorieren. Die einfachste Sortierordnung (Unicode-Codepoint-Sortierordnung), deren Existenz in jeder XQuery-Implementierung zwingend vorgeschrieben ist, vergleicht zwei Zeichenketten, basierend auf den numerischen Werten ihrer einzelnen Zeichen in der Unicode-Darstellung ("Codepoints").

Aus systemtechnischer Perspektive kann eine Sortierordnung als Schnittstelle mit zwei Methoden visualisiert werden. Die erste Methode akzeptiert zwei Zeichenketten und signalisiert, ob diese – aus Sicht der Sortierordnung – identisch sind oder nicht. Die zweite Funktion akzeptiert eine Sequenz von Zeichenketten und liefert die darin enthaltenen Zeichenketten sortiert wieder als Sequenz zurück.

 

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

<< zurückvor >>