Utilisation des fonctions externes stylesheet-declared avec XSLT
En tant qu'alternative à la liaison de méthodes Java™ à des fonctions dans une feuille de style utilisant l'API, les fonctions externes Java peuvent être déclarées directement dans une feuille de style. Des classes Java liées doivent exister sur le chemin d'accès aux classes lors de l'exécution de la feuille de style, il s'agit de la seule configuration supplémentaire requise.
Procédure
<xltxe:java-extension
prefix = string
class = string />
prefix:methodName(Params*)
Exemple
Appel des méthodes statiques
<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 feuille de style exemple fournie suppose que la classe org.company.Calculator contient une méthode statique sqrt() qui utilise un paramètre et que la classe org.standards.Formatter contient une méthode statique format() qui utilise deux paramètres. Lors de la préparation, les classes ne sont pas requises sur le chemin d'accès aux classes mais elles le sont lors de l'exécution de la feuille de style.
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;
}
}
Appel des méthodes d'instance
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);
La feuille de style exemple suppose que la classe org.automobile.Car contient un constructeur qui utilise un argument de type int. De plus, la classe org.automobile.Car contient également une méthode d'instance getDoors() qui n'utilise aucun argument. La syntaxe pour l'appel des méthodes d'instance à partir des fonctions externes stylesheet-declared requiert que l'objet d'instance créé soit transmis en tant que premier argument.
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);
}
}