Utilisation des fonctions externes avec XSLT
Quand vous utilisez une feuille de style XSLT qui utilise des fonctions externes, déclarez les signatures de fonction à l'aide d'une instance XStaticContext et indiquez (ou associez) une implémentation Java pour chaque fonction à l'aide d'une instance XDynamicContext.
Procédure
- Quand vous préparez une feuille de style XSLT qui utilise des fonctions
externes, déclarez les signatures de fonction à l'aide d'une instance
XStaticContext.
L'interface XStaticContext possède deux méthodes declareFunction qui possèdent chacune trois paramètres : un pour le nom, un autre pour le type de fonction et un tableau pour les types des arguments. Le nom est toujours indiqué par un objet QName tandis que les types peuvent être des objets QNames ou XSequenceTypes. La fonction est identifiée de manière unique par le nom de fonction, le type de résultat et les types d'argument.
Une fonction de feuille de style peut avoir le même nom qu'une fonction externe. Si la fonction de la feuille de style contient un attribut override avec la valeur "yes", toute référence à ce nom de fonction dans la feuille de style est une référence à la fonction de la feuille de style. Si la valeur de l'attribut override est "no", il s'agit d'une référence à la fonction externe.
Tableau 1. Méthodes declareFunction de XStaticContext. Ce tableau décrit quand il convient d'utiliser chaque forme des méthodes declareFunction.
Signature de méthode Fonction declareFunction(QName name, QName type, QName[] argTypes) Utilisez cette méthode lorsque la valeur de retour et les arguments de la fonction correspondent tous à des valeurs atomiques uniques Le type QNames doit référencer des types intégrés ou des types globaux déclarés dans un schéma enregistré dans l'instance XFactory utilisée pour créer l'instance XStaticContext. Si un QName référence un type non atomique, le processeur le traite comme le type element(*, ns:type), où ns:type est le QName fourni. L'interface XTypeConstants propose des constantes qui fournissent un objet QName pour chaque type intégré.
declareFunction(QName name, XSequenceType type, XSequenceType[] argTypes) Utilisez cette méthode quand l'un des arguments ou la valeur de retour de la fonction correspond à un noeud ou à une séquence de valeurs atomiques ou de noeuds. La feuille de style ci-après utilise une fonction externe à laquelle le QName ext:pow fait référence.<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://www.example.com/functions" version="2.0"> <xsl:output method="text"/> <xsl:template match="polynomial"> <xsl:variable name="p" select="."/> <xsl:for-each select="1 to 5"> <xsl:text>x = </xsl:text> <xsl:value-of select="."/> <xsl:text>; </xsl:text> <xsl:value-of select="for $t in $p/term return concat($t/@coefficient, 'x^', $t/@power)" separator=" + "/> <xsl:text> = </xsl:text> <xsl:value-of select="sum($p/term/(ext:pow(current(), @power) * @coefficient))"/> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Supposons que cette feuille de style est disponible avec l'objet source xsltSource, le code suivant prépare la feuille de style.// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context XStaticContext staticContext = factory.newStaticContext(); // Declare a namespace for the function staticContext.declareNamespace("ext", "http://www.example.com/functions"); // Create a QName for the name of the function QName methodQName = new QName("http://www.example.com/functions", "pow"); // Declare the function on the static context staticContext.declareFunction(methodQName, XTypeConstants.DOUBLE_QNAME, new QName[]{XTypeConstants.DOUBLE_QNAME, XTypeConstants.DOUBLE_QNAME}); // Create an XSLT executable for the stylesheet XSLTExecutable executable = factory.prepareXSLT(xsltSource, staticContext);
- Pour exécuter une feuille de style XPath qui utilise des fonctions externes,
indiquez (ou associez) les méthodes Java qui implémentent les fonctions à
l'aide d'une instance XDynamicContext.
Utilisez une réflexion Java pour obtenir un objet java.lang.reflect.Method pour la fonction. Si la méthode est une méthode d'instanciation, un objet de méthode doit être spécifié quand vous associez cette fonction.
Une erreur est générée si vous n'indiquez pas de méthode Java pour une function utilisée lors de l'exécution de la feuille de style XSLT.
XDynamicContext contient deux méthodes bindFunction. Chacune requiert un objet QName correspondant au nom de la fonction et un objet Method identifiant la méthode Java qui fournira l'implémentation de la fonction.Tableau 2. Méthodes bindFunction de XDynamicContext. Ce tableau décrit quand il convient d'utiliser chaque forme des méthodes bindFunction de XDynamicContext.
Nom de la méthode Fonction bindFunction(QName qname, Method method) Utilisez cette méthode pour associer une méthode statique bindFunction(QName qname, Method method, Object instanceObject) Utilisez cette méthode pour associer une méthode d'instance L'exemple suivant montre comment exécuter la feuille de style XSLT préparée dans le premier exemple. Le code commence par associer une méthode pour la fonction qu'il utilise. Dans cet exemple, la méthode statique pow(double a, double b) de la classe java.lang.Math est utilisée pour fournir l'implémentation de la fonction externe.// Create a new dynamic context XDynamicContext dynamicContext = factory.newDynamicContext(); // Retrieve the java.lang.reflect.Method object for this function Method method = Math.class.getMethod("pow", Double.TYPE, Double.TYPE); // Bind the function to the dynamic context dynamicContext.bindFunction(methodQName, method); // Create an XML input document String xml = "<polynomial>" + "<term power='2' coefficient='3'/>" + "<term power='1' coefficient='-2'/>" + "<term power='0' coefficient='1'/>" + "</polynomial>"; StreamSource source = new StreamSource(new StringReader(xml)); // Execute the stylesheet XSequenceCursor result = executable.execute(source, dynamicContext); // Serialize the result to System.out result.exportItem(new StreamResult(System.out), executable.getOutputParameters());
Sous-rubriques
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.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_xslt
Nom du fichier : txml_funcs_xslt.html