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

En utilisant l'élément java-extension, vous pouvez lier un préfixe à une classe Java.
<xltxe:java-extension
prefix = string
class = string /> 
Remarque : Tout nom de préfixe peut être utilisé pour l'élément java-extension tant qu'il n'est pas lié à l'espace de nom http://www.ibm.com/xmlns/prod/xltxe-j.
Après la liaison d'un préfixe à une classe Java, les méthodes de la classe liée peuvent être appelées en spécifiant le préfixe et le nom de méthode séparés par un point-virgule :
prefix:methodName(Params*)

Exemple

Appel des méthodes statiques

Lors de la préparation d'une feuille de style XSLT qui utilise des fonctions externes stylesheet-declared, déclarez le préfixe en tant que liaison de classe 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>
Supposons que cette feuille de style est disponible via l'objet source xsltSource, le code suivant prépare la feuille de style :
// Create the factory
XFactory factory = XFactory.newInstance();

// Create an XSLT executable for the stylesheet
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
Le code suivant exécute la feuille de style préparée dans l'exemple :
// 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.

Vous trouverez ci-dessous des exemples d'implémentation des classes org.company.Calculator et 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;
    }
}

Appel des méthodes d'instance

L'appel des méthodes d'instance est légèrement différent de l'appel des méthodes statiques car un objet d'instance est requis. Afin d'obtenir un objet d'instance d'une classe Java dans une feuille de style, vous devez appeler son nouveau constructeur :
prefix:new(Params*)
Vous pouvez ensuite enregistrer le résultat dans une déclaration xsl:variable, comme cela est présenté dans la feuille de style suivante :
<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>
Supposons que cette feuille de style est disponible via l'objet source xsltSource, le code suivant prépare la feuille de style.
// Create the factory
XFactory factory = XFactory.newInstance();

// Create an XSLT executable for the stylesheet
XSLTExecutable executable = factory.prepareXSLT(xsltSource);
Le code suivant exécute la feuille de style préparée dans l'exemple :
// 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.

Vous trouverez ci-dessous un exemple d'implémentation de la classe org.automobile.Car :
package org.automobile;

public class Car {
    private int doors;
	
    public Car (int doors) {
        this.doors = doors;
    }
	
    public int getDoors() {
        return doors;
    }
}
L'héritage avec les méthodes d'instance est également pris en charge. Si la classe org.automobile.Car a une sous-classe org.automobile.Sedan, vous pouvez créer une instance de la classe org.automobile.Sedan et l'utiliser pour appeler des méthodes dans org.automobile.Car. Cette situation est illustrée dans la feuille de style suivante :
<?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>
Vous trouverez ci-dessous un exemple d'implémentation pour org.automobile.Sedan :
package org.automobile;

public class Sedan extends Car {
    public Sedan (int doors) {
        super(doors);
    }
}
Restriction : Il ne doit exister qu'une seule méthode pour le mécanisme utilisé pour la résolution des méthodes dans une classe Java. S'il existe plusieurs méthodes ayant le même nom et un nombre d'arguments différents, une erreur est émise.

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_style_xslt
Nom du fichier : txml_funcs_style_xslt.html