Las hojas de estilo y las expresiones XSLT en XQuery y XPath pueden hacer referencia a ordenaciones utilizando los URI de ordenación. Una ordenación es un conjunto de reglas específicas de una cultura que definen cómo se debe clasificar el texto y qué diferencias entre dos partes de texto se considerarán significativas y cuáles no.
Acerca de esta tarea
El procesador no interpreta el URI de ordenación de ninguna manera, trata al URI de ordenación meramente como un tipo de nombre para la instancia de la clase Java™ Collator que se ha asociado a ese URI. La API de XML proporciona mecanismos para especificar cuál será el URI de ordenación predeterminado en el tiempo de preparación y para asociar una instancia de la clase Java Collator con un URI de ordenación en el tiempo de ejecución.
Todos los URI de ordenación especificados a través de la API de XML deben ser referencias de URI absolutas. En una hoja de estilo XSLT o una expresión XQuery o XPath, cualquier referencia relativa a un URI que se utilice en un contexto en que el URI de ordenación sea necesario, se resolverá con el URI base del contexto estático para esa expresión. Con esta acción se asegura que incluso las referencias relativas a un URI de la hoja de estilo o expresión se puedan comparar con las referencias absolutas a los URI especificados a través de la API de XML.
Limitaciones: - Si un URI de ordenación está enlazado a una instancia de la clase Java Collator que no es una instancia de java.text.RuleBasedCollator, habrá algunas operaciones no permitidas con ese URI de ordenación. En particular, las funciones fn:starts-with, fn:ends-with,
fn:contains, fn:substring-before y fn:substring-after no reciben soporte con ese URI de ordenación.
- Todas las instancias de Collator que se hayan incluido actualmente con el entorno de tiempo de ejecución de
Java también serán instancias de
java.text.RuleBasedCollator, por lo que para la mayor parte de objetivos solamente representará un límite teórico. Sin embargo, hay que fijarse en si una aplicación define sus propias instancias de la clase
Java Collator o si define subclases de la clase
Collator que tampoco son instancias de java.text.RuleBasedCollator.
- Declaración del URI de ordenación predeterminado.
Puede especificar qué URI de ordenación desea utilizar como predeterminado para operaciones de comparación de series utilizando el método setDefaultCollation en la interfaz XStaticContext. El URI de ordenación predeterminado de la interfaz XStaticContext se utilizará como URI de ordenación en operaciones de comparación de series que no especifican explícitamente ningún URI de ordenación.
Una expresión XQuery puede sustituir al URI de ordenación predeterminado que se especifica en la interfaz
XStaticContext con la declaración de ordenación predeterminada declare. De igual modo, una hoja de estilo XSLT puede sustituir el URI de ordenación predeterminado por el atributo
[xsl:]default-collation.
XPath no proporciona un modo de sustituir el URI de ordenación predeterminado. Sin embargo, cualquier expresión XPath o XQuery u hoja de estilo XSLT que lleve a cabo operaciones de comparación de series puede especificar un URI de ordenación explícito para que sustituya al URI de ordenación predeterminado.
Si no especifica explícitamente una ordenación predeterminada en una instancia de la interfaz
XStaticContext que suministra cuando prepara la hoja de estilo XSLT o la expresión
XQuery o XPath, el URI de ordenación predeterminado para la hoja de estilo o expresión será el URI de ordenación de punto de código Unicode:
http://www.w3.org/2005/xpath-functions/collation/codepoint/.
Puede utilizar la ordenación de punto de código Unicode en situaciones en que los caracteres deben ser idénticos a los caracteres Unicode que se deberán considerar iguales.
La ordenación lexicográfica definida por esta ordenación viene determinada por los puntos de código Unicode de los caracteres, es decir, por sus posiciones en las gráficas de códigos Unicode. Para ello, la utilización de la ordenación de punto de código Unicode ofrecerá un mayor rendimiento que las ordenaciones que llevan a cabo comparaciones de series de una forma específica de una cultura, pero es poco probable que ofrezca muchos resultados satisfactorios para las operaciones de clasificación.
A continuación encontrará un ejemplo que muestra cómo se especifica el URI de ordenación predeterminado en una instancia de la interfaz
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);
- Enlace de un URI de ordenación.
La API XML proporciona dos métodos para enlazar URI de ordenación con una instancia de la clase
Java Collator para una ejecución. Los métodos bindCollation del método
XDynamicContext tienen dos argumentos: el primer argumento es un URI de ordenación; el segundo es una instancia de la clase
java.text.Collator o una instancia de la clase java.util.Locale.
Si se especifica una instancia de la clase local, el procesador utilizará la instancia de la clase
Collator que resulte adecuada para ese valor local.
XSLT, XPath y XQuery definen
el concepto de "ordenaciones conocidas estáticamente". Si aparece una referencia de un URI de ordenación en una hoja de estilo
XSLT o en una expresión XPath o XQuery, y si el URI de ordenación no es una de las ordenaciones conocidas estáticamente, se supone que se avisará de un error estático en determinadas circunstancias. Sin embargo, el procesador trata a los URI de ordenación como si estuvieran en el conjunto de ordenaciones conocidas estáticamente. Esto es debido al hecho que las instancias de la clase Java Collator no están asociadas a los URI de ordenación hasta el tiempo de ejecución, por lo que no es posible que el procesador determine estáticamente qué URI de ordenación son conocidos. En su lugar, el procesador informará de un error dinámico si en una hoja de estilo o expresión se utiliza un URI de ordenación que no está enlazado a una instancia de la clase
Collator.
No puede enlazar el URI de ordenación de punto de código Unicode a ninguna instancia de la clase Java Collator. Siempre estará implícitamente enlazado a la ordenación de punto de código Unicode.
En el ejemplo siguiente se demuestra cómo se puede enlazar un URI de ordenación con una instancia específica de la clase
Java Collator en una instancia de la interfaz 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());
}