Les expressions et les transformations XSLT utilisées dans XQuery et XPath peuvent référencer des classements à l'aide d'URI de classement. Un classement est un ensemble de règles culturelles qui définissent comment trier le contenu d'un texte et comment distinguer ce qui est significatif ou pas dans les différentes parties d'un texte.
Pourquoi et quand exécuter cette tâche
Le processeur interprète un URI de classement d'une manière particulière : Il le traite comme une sorte de nom désignant l'instance de la classe
Java™ Collator
associée à cet URI. L'API XML possède des mécanismes qui permettent d'indiquer quel sera l'URI de classement par défaut utilisé au moment de la préparation et d'associer une instance de la classe Java Collator
à un URI de classement au moment de l'exécution.
Tous les URI de classement doivent être spécifiés dans l'API XML sous la forme de références d'URI absolu.
Dans une feuille de style
XSLT ou une expression XPath ou XQuery, toutes les références à un URI relatif qui sont utilisées dans un contexte où un URI de classement est demandé sont converties par rapport à l'URI de base depuis le contexte statique de
l'expression ou de la feuille de style. De cette manière, même les références d'URI relatif spécifiées dans la feuille de style ou l'expression peuvent être mises en correspondance avec les références d'URI absolu spécifiées dans l'API XML.
Limitations : - Si un URI de classement est lié à une instance de la classe Java Collator autre que
java.text.RuleBasedCollator, certaines opérations seront impossible avec cet URI de classement. En particulier, les fonctions fn:starts-with, fn:ends-with,
fn:contains, fn:substring-before et fn:substring-after sont inaccessibles pour ce type d'URI de classement.
- Toutes les instances de la classe Collator actuellement incluses dans l'environnement d'exécution Java sont également des
instances de la classe java.text.RuleBasedCollator. Cette observation constitue donc une limitation principalement théorique. Toutefois, il faut en être conscient dans le cas où une application définit ses propres instances de la classe Java Collator ou définit des sous-classes d'une classe
Collator autre que java.text.RuleBasedCollator.
- Déclarer l'URI de classement par défaut.
Vous pouvez indiquer l'URI de classement que vous voulez utiliser par défaut pour la comparaison de chaînes à l'aide de la méthode setDefaultCollation dans l'interface XStaticContext. L'URI de classement par défaut de l'interface XStaticContext sera alors utilisé pour les comparaisons de chaînes quand aucun autre URI de classement ne sera explicitement indiqué.
Une expression XQuery peut ignorer l'URI de classement indiqué dans l'interface XStaticContext si une déclaration de classement par défaut est définie. De même, une feuille de style XSLT peut ignorer l'URI de classement par défaut si vous spécifiez l'attribut
[xsl:]default-collation.
XPath ne permet pas d'ignorer l'URI de classement par défaut. Toutefois, une expression XQuery ou XPath, ou une feuille de style XSLT, qui exécute une comparaison de chaînes peut spécifier un URI de classement explicite pour ignorer l'URI de classement par défaut.
Si vous n'indiquez pas explicitement un classement par défaut dans une instance de l'interface XStaticContext quand vous préparez votre feuille de style XSLT ou votre expression XPath ou XQuery, l'URI de classement par défaut de la feuille de style ou de l'expression sera l'URI du classement par points de code Unicode : http://www.w3.org/2005/xpath-functions/collation/codepoint/.
Vous pouvez utiliser le classement par points de code
Unicode dans les situations où les caractères doivent être des caractères
Unicode identiques pour être considérés comme égaux.
L'ordonnancement lexicographique défini par ce classement est déterminé par les points de code Unicode des caractères, autrement dit par leurs
positions dans les tables de codes Unicode. L'utilisation du classement par points de code Unicode produira de meilleurs résultats que les classements qui exécutent des comparaisons de chaînes sur une base culturelle, mais ses performances seront moindres pour les opérations de tri.
L'exemple de code ci-après illustre comment indiquer un URI de classement par défaut dans une instance de l'interface XStaticContext.
// Setting of default collation URI is not changed - default remains
// the Unicode code point collation URI
XFactory factory = XFactory.newInstance();
XPathExecutable maxPath1 = factory.prepareXPath("max($var)");
// A new default collation URI is specified in the static context
// That URI is used in any string comparison for which no other
// explicit collation URI is specified
XStaticContext sc = factory.newStaticContext();
sc.setDefaultCollation("http://example.org/my-collation");
XPathExecutable maxPath2 = factory.prepareXPath("max($var)", sc);
- Lier un URI de classement.
L'API XML propose deux manières de lier un URI de classement à une instance de la classe Java Collator pour une exécution.
La méthode bindCollation
de l'interface XDynamicContext a deux arguments : le premier
argument est un URI de classement et le deuxième est une instance de la classe java.text.Collator ou de la classe java.util.Locale. Si vous spécifiez une instance de la classe locale, le processeur utilise l'instance de la classe Collator appropriée à l'environnement local.
XSLT, XPath et XQuery utilisent un concept appelé le "classement statiquement connu". Si une référence d'URI de classement figure dans une feuille de style XSLT ou une expression XQuery ou XPath, et que cet URI de classement ne figure pas parmi les classements statiquement connus, une erreur statique sera signalée dans certaines circonstances. Cependant, le processeur traite tous les URI de classement comme s'ils faisaient partie des classements statiquement connus. En effet, les instances de la classe Java Collator n'étant pas
associées à des URI de classement avant l'exécution, il est impossible pour le processeur de déterminer statiquement quels URI de classement sont inconnus. Pour cette raison, le processeur signalera une erreur dynamique si un URI de classement non lié à une instance de la classe Collator figure dans une feuille de style ou une expression.
Vous ne pouvez pas lier l'URI du classement par points de code Unicode à une instance de la classe Java Collator. En effet, cette classe est toujours liée
implicitement au classement par points de code Unicode.
L'exemple suivant montre comment lier un URI de classement à une instance spécifique de la classe Java Collator dans une instance de l'interface XDynamicContext.
XFactory factory = XFactory.newInstance();
XStaticContext sc = factory.newStaticContext();
// Set up a default collation URI
sc.setDefaultCollation("http://example.org/my-collation");
// Prepare an XPath expression that computes fn:max() using the
// collator associated with the default collation URI and again using
// the Unicode code point collation
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();
// Set the value of the variable $var
dc.bind(new QName("var"),
new String[] {"encyclopaedia",
// U+00E6 is lower case latin ae ligature
"encyclop\u00E6dia",
"encyclopedia"});
// Set up a Collator for English that does not distinguish between
// capitals, lower-case letters and certain character variants
Collator english =
(Collator) Collator.getInstance(Locale.ENGLISH).clone();
english.setStrength(Collator.SECONDARY);
// Evaluate the expression with that English collator associated with
// the default collation URI
dc.bindCollation("http://example.org/my-collation", english);
XSequenceCursor maxValues = maxPath.execute(dc);
// Print maximum values - expected results are
// encyclopedia for English collation and
// encyclop\u00E6dia for Unicode code point collation
if (maxValues != null) {
do {
System.out.println(maxValues.getStringValue());
} while (maxValues.toNext());
}