Usando funções externas declaradas na folha de estilo com XSLT
Como alternativa para ligar métodos Java™ a funções em uma folha de estilo usando a API, as funções externas Java podem ser declaradas diretamente dentro de uma folha de estilo. A única configuração adicional necessária é que classes Java ligadas existam no caminho de classe durante a execução da folha de estilo.
Procedimento
<xltxe:java-extension
prefix = string
class = string />
http://www.ibm.com/xmlns/prod/xltxe-j
.prefix:methodName(Params*)
Exemplo
Chamando 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);
A folha de estilo de exemplo fornecida supõe que a classe org.company.Calculator contém um método estático sqrt() que leva um parâmetro e a classe org.standards.Formatter contém um método estático format() que leva dois parâmetros. No momento do preparo, as classes não são necessárias no caminho de classe, mas são necessárias durante a execução da folha 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;
}
}
Invoking Instance Methods
prefix: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);
A folha de estilo de exemplo supõe que a classe org.automobile.Car contém uma construtora que leva um argumento do tipo int. Além disso, a classe org.automobile.Car também contém um método de instância getDoors() que não aceita argumentos. A sintaxe para chamar métodos de instância por meio de funções externas declaradas na folha de estilo requer que o objeto de instância criado seja transmitido como o primeiro 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);
}
}