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

  1. 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>&#xA;</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);
  2. 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());

Icon that indicates the type of topic Task topic



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