XSLT-Style-Sheets und XQuery- bzw. XPath-Ausdrücke können mit
Sortierfolgen-URIs auf Sortierfolgen verweisen. Für eine Sortierfolge gibt es eine Reihe kulturspezifischer
Regeln, die definieren, wie Text sortiert werden soll und welche Unterschiede zwischen zwei Textteilen als relevant
bzw. als irrelevant betrachtet werden.
Vorbereitende Schritte
In diesem Artikel wird davon ausgegangen, dass Sie über Basiswissen zu den Klassen java.util.Locale
und java.text.Collator verfügen.
Informationen zu diesem Vorgang
Der Prozessor führt keinerlei Interpretation des Sortierfolgen-URI durch,
sondern betrachtet diesen als eine Art Name für die Instanz der
Java™-Klasse Collator, die diesem URI zugeordnet ist. Die API XML stellt Mechanismen für die
Angabe des Standardsortierfolgen-URI in der Vorbereitungszeit und für
die Zuordnung einer Instanz der Java-Klasse Collator
zu einem Sortierfolgen-URI in der Ausführungszeit bereit.
Alle mithilfe der API XML angegebenen
Sortierfolgen-URIs müssen Verweise auf absolute URIs sein. In
einem XSLT-Style-Sheet oder einem XQuery- bzw. XPath-Ausdruck wird jeder Verweis auf einen relativen URI in einem Kontext, in dem
ein Sortierfolgen-URI erforderlich ist, anhand des Basis-URI aus dem statischen Kontext für diesen Ausdruck aufgelöst.
Damit wird sichergestellt, dass selbst Verweise auf relative URIs im Style-Sheet oder Ausdruck mit den über die API XML angegebenen
Verweisen auf absolute URIs abgeglichen werden können.
Einschränkungen: - Wenn ein Sortierfolgen-URI an eine Instanz der Java-Klasse Collator gebunden ist, die keine Instanz von
java.text.RuleBasedCollator ist, sind bestimmte Operationen für diesen Sortierfolgen-URI nicht zulässig. Dies gilt insbesondere für die Funktionen fn:starts-with, fn:ends-with,
fn:contains, fn:substring-before und fn:substring-after, die für diesen Sortierfolgen-URI nicht unterstützt
werden.
- Alle derzeit in der Java-Laufzeit enthaltenen Instanzen von Collator sind gleichzeitig Instanzen
von java.text.RuleBasedCollator. Die genannte Einschränkung ist somit in den meisten Fällen eine rein theoretische. Sie sollten jedoch Kenntnis von dieser Einschränkung haben,
falls eine Anwendung eigene Instanzen oder Unterklassen der Java-Klasse Collator definiert, die nicht auch
Instanzen von java.text.RuleBasedCollator sind.
Vorgehensweise
- Standardsortierfolgen-URI deklarieren
Sie können angeben, welchen Sortierfolgen-URI Sie standardmäßig für Zeichenfolgenvergleiche verwenden
möchten, indem Sie die Methode
setDefaultCollation für das Interface
XStaticContext angeben. Für Zeichenfolgenvergleiche, bei denen nicht explizit ein Sortierfolgen-URI angegeben ist, wird der Standardsortierfolgen-URI
des Interface XStaticContext verwendet.
Ein XQuery-Ausdruck kann den für das Interface
XStaticContext angegebenen Standardsortierfolgen-URI durch Deklaration einer Standardsortierfolge
außer Kraft setzen. In ähnlicher Weise kann ein XSLT-Style-Sheet den Standardsortierfolgen-URI mit dem Attribut
[xsl:]default-collation außer Kraft setzen.
XPath stellt kein Mittel für die Außerkraftsetzung des Standardsortierfolgen-URI bereit. Allerdings kann jeder XPath- oder XQuery-Ausdruck und jedes XSLT-Style-Sheet, der bzw. das
Zeichenfolgenvergleiche durchführt, einen expliziten Sortierfolgen-URI angeben und damit den Standardsortierfolgen-URI überschreiben.
Wenn Sie bei der Vorbereitung Ihres XSLT-Style-Sheets oder Ihres XQuery- bzw. XPath-Ausdrucks für keine angegebene Instanz
des Interface
XStaticContext eine Standardsortierfolge angeben,
wird als Standardsortierfolgen-URI für das Style-Sheet oder den Ausdruck
der
Sortierfolgen-URI für Unicode-Codepunkte verwendet: http://www.w3.org/2005/xpath-functions/collation/codepoint/.
Die Sortierfolge für Unicode-Codepunkte können Sie anwenden,
wenn Zeichen, die als gleich betrachtet werden sollen, identische Unicode-Zeichen sein müssen.
Die lexikografische Sortierung wird bei dieser Sortierfolge von den
Unicode-Codepunkten der Zeichen, d. h. von der Position der Zeichen in den Unicode-Codetabellen
bestimmt. Mit der Sortierfolge für Unicode-Codepunkte können Sie daher viel bessere Ergebnisse erzielen als mit Sortierfolgen, die
kulturspezifische Zeichenfolgenvergleiche durchführen. Allerdings sind bei Sortieroperationen die mit der Sortierfolge für Unicode-Codepunkte erzielten Ergebnisse wahrscheinlich
nicht zugriedenstellend.
Das folgende einfache Beispiel zeigt, wie der Standardsortierfolgen-URI für eine Instanz des Interface
XStaticContext angegeben wird.
// Einstellung des Standardsortierfolgen-URI wird nicht geändert -
// Standardeinstellung bleibt der Kollations-URI des Unicode-Codepunkts
XFactory factory = XFactory.newInstance();
XPathExecutable maxPath1 = factory.prepareXPath("max($var)");
// Im statischen Kontext wird ein neuer Standardsortierfolgen-URI angegeben.
// Dieser URI wird für alle Zeichenfolgenvergleiche verwendet, für die nicht
// explizit ein anderer Sortierfolgen-URI angegeben ist.
XStaticContext sc = factory.newStaticContext();
sc.setDefaultCollation("http://example.org/my-collation");
XPathExecutable maxPath2 = factory.prepareXPath("max($var)", sc);
- Sortierfolgen-URI binden
Die API XML stellt zwei Methoden für die Bindung eines Sortierfolgen-URI an eine Instanz
der Java-Klasse Collator für eine Ausführung bereit. Die bindCollation-Methoden
für das Interface XDynamicContext verwenden zwei Argumente. Das erste Argument ist ein Sortierfolgen-URI und das zweite
ist eine Instanz der Klasse
java.text.Collator oder der Klasse java.util.Locale.
Wenn eine Instanz der Locale-Klasse angegeben ist, verwendet der Prozessor die für die entsprechende Ländereinstellung geeignete
Instanz der Collator-Klasse.
In XSLT, XPath und XQuery ist das Konzept der statisch bekannten Sortierfolgen definiert. Wenn in einem
XSLT-Style-Sheet oder in in einem XPath- bzw. XQuery-Ausdruck ein Verweis auf einen Sortierfolgen-URI erscheint, der kein URI der statisch bekannten Sortierfolgen
ist, wird unter bestimmten Umständen ein statischer Fehler gemeldet. Der Prozessor behandelt jedoch alle Sortierfolgen-URIs so, als ob sie zur Gruppe der URIs
für statisch bekannte Sortierfolgen gehören würden. Dies ist darauf zurückzuführen, dass Instanzen der Java-Klasse Collator bis zur Ausführungszeit
keinen Sortierfolgen-URIs zugeordnet werden. Der Prozessor kann somit nicht statisch bestimmen, welche Sortierfolgen-URIs unbekannt sind. Wenn in einem Style-Sheet oder Ausdruck ein Sortierfolgen-URI
verwendet wird, der nicht an eine Instanz der Klasse Collator gebunden ist, meldet der Prozessor stattdessen einen dynamischen Fehler.
Den Sortierfolgen-URI für Unicode-Codepunkte können Sie nicht an eine Instanz
der Java-Klasse Collator binden. Er ist immer implizit an die Sortierfolge für Unicode-Codepunkte
gebunden.
Das folgende Beispiel veranschaulicht die Bindung eines Sortierfolgen-URI
an eine bestimmte Instanz der Java-Klasse Collator für eine Instanz des Interface XDynamicContext.
XFactory factory = XFactory.newInstance();
XStaticContext sc = factory.newStaticContext();
// Standardsortierfolgen-URI konfigurieren
sc.setDefaultCollation("http://example.org/my-collation");
// XPath-Ausdruck erstellen, der fn:max() mit dem Collator berechnet,
// der dem Standardsortierfolgen-URI zugeordnet ist, und danach erneut
// mit der Sortierfolge für Unicode-Codepunkte
String expr =
"max($var)," +
"max($var,'http://www.w3.org/2005/xpath-functions/collation/codepoint')";
XPathExecutable maxPath =
factory.prepareXPath(expr, sc);
XDynamicContext dc = factory.newDynamicContext();
// Wert der Variablen $var setzen
dc.bind(new QName("var"),
new String[] {"encyclopaedia",
// U+00E6 is lower case latin ae ligature
"encyclop\u00E6dia",
"encyclopedia"});
// Collator für Englisch konfigurieren, der nicht zwischen Großbuchstaben,
// Kleinbuchstaben und bestimmten Zeichenvarianten unterscheidet
Collator english =
(Collator) Collator.getInstance(Locale.ENGLISH).clone();
english.setStrength(Collator.SECONDARY);
// Ausdruck mit dem Collator für Englisch auswerten, der dem
// Standardsortierfolgen-URI zugeordnet ist
dc.bindCollation("http://example.org/my-collation", english);
XSequenceCursor maxValues = maxPath.execute(dc);
// Maximalwerte ausgeben. Für die englische Sortierfolge wird das Ergebnis
// encyclopedia erwartet und für die Sortierfolge für Unicode-Codepunkte
// das Ergebnis encyclop\u00E6dia.
if (maxValues != null) {
do {
System.out.println(maxValues.getStringValue());
} while (maxValues.toNext());
}