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
<xltxe:java-extension
prefix = string
class = string />
prefijo:nombreMétodo(Params*)
Ejemplo
Invocación de métodos estáticos
<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>
// Create the factory
XFactory factory = XFactory.newInstance();
// Create an XSLT executable for the stylesheet
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
// 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.
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
prefijo:new(Params*)
<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>
// Create the factory
XFactory factory = XFactory.newInstance();
// Create an XSLT executable for the stylesheet
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
// 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.
package org.automobile;
public class Car {
private int doors;
public Car (int doors) {
this.doors = doors;
}
public int getDoors() {
return doors;
}
}
<?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>
package org.automobile;
public class Sedan extends Car {
public Sedan (int doors) {
super(doors);
}
}