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.

Procedimiento

Utilizando el elemento java-extension, puede enlazar un prefijo con una clase Java.
<xltxe:java-extension
prefix = string
class = string /> 
Nota: Puede utilizarse cualquier nombre de prefijo para el elemento java-extension, siempre y cuando esté enlazado al espacio de nombres http://www.ibm.com/xmlns/prod/xltxe-j.
Después de enlazar un prefijo a una clase Java, se pueden invocar los métodos de la clase enlazada especificando el prefijo y el nombre del método, separados por dos puntos:
prefijo:nombreMétodo(Params*)

Ejemplo

Invocación de métodos estáticos

Cuando prepare una hoja de estilo XSLT que utilice funciones externas declaradas en una hoja de estilo, declare el prefijo en un enlace de clase Java.
<xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xltxe="http://www.ibm.com/xmlns/prod/xltxe-j"
     xmlns:calc="http://com.example/myApp/calculator"
     xmlns:sf="http://com.example/myApp/standardFormat">
 
<xltxe:java-extension prefix="calc" class="org.company.Calculator"/>
<xltxe:java-extension prefix="sf" class="org.standards.Formatter"/>
 
<xsl:template match="/">
     <xsl:value-of select="sf:format(calc:sqrt(64), 'ISO-42.7')"/>
</xsl:template>

</xsl:stylesheet>
Si suponemos que esta hoja de estilo está disponible utilizando el objeto xsltSource Source, el código siguiente prepara la hoja de estilo:
// Create the factory
XFactory factory = XFactory.newInstance();

// Create an XSLT executable for the stylesheet
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
El código siguiente ejecuta la hoja de estilo que se ha preparado en el ejemplo:
// Create the xml input
String xml = "<doc/>";

// Create a result object to store the transformation result
Result result = new StreamResult(System.out);

// Execute the XSLT executable
executable.execute(new StreamSource(new ByteArrayInputStream(xml.getBytes())), result);

La hoja de estilo de ejemplo proporcionada presupone que la clase org.company.Calculator contiene un método estático sqrt() que toma un parámetro y la clase org.standards.Formatter contiene un método estático format() que toma dos parámetros. Durante la preparación, no son necesarias las clases en la vía de acceso de clases, pero sí son necesarias durante la ejecución de la hoja de estilo.

A continuación, se muestran implementaciones de ejemplo de las clases org.company.Calculator y org.standards.Formatter:
package org.company;

public class Calculator {
    public static int sqrt(int val) {
        return (int)Math.sqrt(val);
    }
}
package org.standards;

public class Formatter {
    public static String format(int val, String pattern) {
        return "Formatting " + val + " using pattern " + pattern;
    }
}

Invocación de métodos de instancia

La invocación de métodos de instancia es un poco distinta a la invocación de métodos estáticos a causa del requisito de un objeto de instancia. Para obtener un objeto de instancia de una clase Java dentro de una hoja de estilo, debe invocar su nuevo constructor:
prefijo:new(Params*)
Luego, puede almacenar el resultado en un elemento xsl:variable, tal como muestra la siguiente hoja de estilo:
<xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xltxe="http://www.ibm.com/xmlns/prod/xltxe-j"
     xmlns:car="http://com.example/myApp/car">
 
<xltxe:java-extension prefix="car" class="org.automobile.Car"/>

<xsl:variable name="var" select="car:new(3)"/>
 
<xsl:template match="/">
     <xsl:value-of select="car:getDoors($var)"/>
</xsl:template>

</xsl:stylesheet>
Si suponemos que esta hoja de estilo está disponible utilizando el objeto xsltSource Source, el código siguiente prepara la hoja de estilo.
// Create the factory
XFactory factory = XFactory.newInstance();

// Create an XSLT executable for the stylesheet
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
El código siguiente ejecuta la hoja de estilo que se ha preparado en el ejemplo:
// Create the xml input
String xml = "<doc/>";

// Create a result object to store the transformation result
Result result = new StreamResult(System.out);

// Execute the XSLT executable
executable.execute(new StreamSource(new ByteArrayInputStream(xml.getBytes())), result);

La hoja de estilo de ejemplo supone que la clase org.automobile.Car contiene un constructor que toma un argumento de tipo int. Además, la clase org.automobile.Car también contiene un método de instancia getDoors() que no toma argumentos. La sintaxis para invocar métodos de instancia de funciones externas declaradas en hojas de estilo requiere que el objeto de instancia creado se pase como el primer argumento.

A continuación, se muestra una implementación de ejemplo de la clase org.automobile.Car:
package org.automobile;

public class Car {
    private int doors;
	
    public Car (int doors) {
        this.doors = doors;
    }
	
    public int getDoors() {
        return doors;
    }
}
También está soportada la herencia con métodos de instancia. Si la clase org.automobile.Car tiene una subclase org.automobile.Sedan, puede crear una instancia de la clase org.automobile.Sedan y utilizarla para llamar a métodos en org.automobile.Car. Esto se muestra en la hoja de estilo siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xltxe="http://www.ibm.com/xmlns/prod/xltxe-j"
     xmlns:sedan="http://com.example/myApp/sedan"
     xmlns:car="http://com.example/myApp/car">
 
<xltxe:java-extension prefix="sedan" class="org.automobile.Sedan"/>
<xltxe:java-extension prefix="car" class="org.automobile.Car"/>

<xsl:variable name="var" select="sedan:new(5)"/>
 
<xsl:template match="/">
     <xsl:value-of select="car:getDoors($var)"/>
</xsl:template>

</xsl:stylesheet>
A continuación, se muestra una implementación de ejemplo para org.automobile.Sedan:
package org.automobile;

public class Sedan extends Car {
    public Sedan (int doors) {
        super(doors);
    }
}
Limitación: El mecanismo utilizado para resolver los métodos de una clase Java requiere que sólo exista un método que coincida en nombre y número de parámetros. Si hay varios métodos con el mismo nombre y distinto número de parámetros, se genera un error.

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_style_xslt
File name: txml_funcs_style_xslt.html