Utilización de funciones externas con XSLT
Cuando utilice una hoja de estilo XSLT que utilice funciones externas, declare las firmas de función utilizando una instancia XStaticContext y proporcione (o enlace) una implementación Java para cada función utilizando una instancia XDynamicContext.
Procedimiento
- Cuando prepare una hoja de estilo XSLT que utilice funciones externas, declare las firmas de función utilizando una instancia XStaticContext.
La interfaz XStaticContext tiene dos métodos declareFunction, cada uno de los cuales tiene tres parámetros: uno para el nombre, uno para el tipo de retorno de la función y una matriz para los tipos de argumentos. El nombre siempre se proporciona como objeto QName pero los tipos pueden ser Qnames o XSequenceTypes. El nombre de función, el tipo de retorno y los tipos de argumento deben identificar de forma exclusiva la función.
Una función de la hoja de estilo podría tener el mismo nombre que una función externa. Si la función de la hoja de estilo tiene un atributo de sustitución con el valor de yes, cualquier referencia a ese nombre de función de la hoja de estilo será una referencia a la función de la hoja de estilo; si tiene un atributo de sustitución con el valor de no, será una referencia a la función externa.
Tabla 1. Métodos declareFunction de XStaticContext. En esta tabla se explica cuándo se utiliza cada forma del método declareFunction.
Firma de método Finalidad declareFunction(QName name, QName type, QName[] argTypes) Se utiliza cuando el valor de retorno y los argumentos de la función sean valores atómicos únicos El tipo QNames debe hacer referencia a los tipos incorporados o tipos globales declarados en un esquema que se ha registrado en la instancia XFactory que se utiliza para crear la instancia XStaticContext. Si un QName hace referencia a un tipo no atómico, el procesador lo tratará como el tipo element(*, ns:type), donde ns:type es el QName indicado. La interfaz XTypeConstants tiene disponibles constantes adecuadas que proporcionan un objeto QName para cada tipo incorporado.
declareFunction(QName name, XSequenceType type, XSequenceType[] argTypes) Se utiliza cuando cualquiera de los argumentos o el valor de retorno de la función es un nodo o una secuencia de valores atómicos o nodos La hoja de estilo siguiente utiliza una función externa a la que hace referencia el QName ext:pow.<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://www.example.com/functions" version="2.0"> <xsl:output method="text"/> <xsl:template match="polynomial"> <xsl:variable name="p" select="."/> <xsl:for-each select="1 to 5"> <xsl:text>x = </xsl:text> <xsl:value-of select="."/> <xsl:text>; </xsl:text> <xsl:value-of select="for $t in $p/term return concat($t/@coefficient, 'x^', $t/@power)" separator=" + "/> <xsl:text> = </xsl:text> <xsl:value-of select="sum($p/term/(ext:pow(current(), @power) * @coefficient))"/> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Si suponemos que la hoja de estilo especificada está disponible utilizando el objeto de fuente xsltSource, el código siguiente prepara la hoja de estilo.// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context XStaticContext staticContext = factory.newStaticContext(); // Declare a namespace for the function staticContext.declareNamespace("ext", "http://www.example.com/functions"); // Create a QName for the name of the function QName methodQName = new QName("http://www.example.com/functions", "pow"); // Declare the function on the static context staticContext.declareFunction(methodQName, XTypeConstants.DOUBLE_QNAME, new QName[]{XTypeConstants.DOUBLE_QNAME, XTypeConstants.DOUBLE_QNAME}); // Create an XSLT executable for the stylesheet XSLTExecutable executable = factory.prepareXSLT(xsltSource, staticContext);
- Para ejecutar una hoja de estilo XSLT que utiliza funciones externas, proporcione (o enlace) los métodos Java que implementan las funciones utilizando una instancia XDynamicContext.
Utilice el reflejo Java para obtener un objeto java.lang.reflect.Method para la función. Si el método es un método de instancia, será necesario un objeto de instancia cuando se enlace esta función.
Se llega a un error si no se proporciona un método Java para una función que se utiliza al ejecutar la hoja de estilo XSLT.
XDynamicContext tiene dos métodos bindFunction. Cada uno de ellos requiere un objeto QName correspondiente al nombre de la función y un objeto Method que identifica el método Java que proporcionará la implementación de la función.Tabla 2. Métodos bindFunction de XDynamicContext. En esta tabla se explica cuándo se utiliza cada forma de los métodos bindFunction de XDynamicContext.
Nombre del método Finalidad bindFunction(QName qname, Method method) Se utiliza cuando se enlaza un método estático bindFunction(QName qname, Method method, Object instanceObject) Se utiliza cuando se enlaza un método de instancia El ejemplo siguiente ejecuta la hoja de estilo XSLT preparada en el primer ejemplo, enlazando primero un método para la función que utiliza. En este ejemplo, el método pow(double a, double b) estático de la clase java.lang.Math se utiliza para proporcionar la implementación de la función externa.// Crear un nuevo contexto dinámico XDynamicContext dynamicContext = factory.newDynamicContext(); // Retrieve the java.lang.reflect.Method object for this function Method method = Math.class.getMethod("pow", Double.TYPE, Double.TYPE); // Bind the function to the dynamic context dynamicContext.bindFunction(methodQName, method); // Create an XML input document String xml = "<polynomial>" + "<term power='2' coefficient='3'/>" + "<term power='1' coefficient='-2'/>" + "<term power='0' coefficient='1'/>" + "</polynomial>"; StreamSource source = new StreamSource(new StringReader(xml)); // Execute the stylesheet XSequenceCursor result = executable.execute(source, dynamicContext); // Serialize the result to System.out result.exportItem(new StreamResult(System.out), executable.getOutputParameters());
Subtopics
Utilización de funciones externas declaradas en hojas de estilo con XSLT
Como alternativa al enlace de métodos Java con funciones en una hoja de estilo utilizando la API, las funciones externas Java se pueden declarar directamente dentro de una hoja de estilo. La única configuración adicional necesaria es que las clases Java enlazadas estén en la vía de acceso de clases durante la ejecución de la hoja de estilo.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_xslt
File name: txml_funcs_xslt.html