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

  1. 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>&#xA;</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);
  2. 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());

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_xslt
Nom du fichier : txml_funcs_xslt.html