Utilisation des fonctions externes avec XPath
Quand vous utilisez une expression XPath 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 expression XPath 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.
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. L'exemple ci-après illustre comment préparer une expression XPath qui utilise une fonction externe.// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context XStaticContext staticContext = factory.newStaticContext(); // Declare a namespace for the function staticContext.declareNamespace("my", "http://myfunc"); // Create a QName for the name of the function QName methodQName = new QName("http://myfunc", "pow"); // Declare the function on the static context staticContext.declareFunction(methodQName, XTypeConstants.DOUBLE_QNAME, new QName[]{XTypeConstants.DOUBLE_QNAME, XTypeConstants.DOUBLE_QNAME}); // Create an XPath executable for the expression XPathExecutable executable = factory.prepareXPath("sum(/polynomial/term/(my:pow(2, @power) * @coefficient))", staticContext);
- Pour exécuter une expression 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 l'expression XPath.
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 l'expression XPath 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 expression XSequenceCursor result = executable.execute(source, dynamicContext); // Serialize the result to System.out result.exportItem(new StreamResult(System.out));


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