Utilización de funciones externas con XPath
Cuando utilice una expresión XPath que utilice funciones externas, declare las firmas de función utilizando una instancia XStaticContext y proporcione (o enlace) una implementación Java para cada función utilizando una instancia XDynamicContext.
Procedimiento
- Cuando prepare una expresión XPath que utilice funciones externas, declare las firmas de función utilizando una instancia XStaticContext.
La interfaz XStaticContext tiene dos métodos declareFunction, cada uno de los cuales tiene tres parámetros: uno para el nombre, uno para el tipo de retorno de la función y una matriz para los tipos de argumentos. El nombre siempre se proporciona como objeto QName pero los tipos pueden ser Qnames o XSequenceTypes. El nombre de función, el tipo de retorno y los tipos de argumento deben identificar de forma exclusiva la función.
Tabla 1. Métodos declareFunction de XStaticContext. En esta tabla se explica cuándo se utiliza cada forma del método declareFunction.
Firma de método Finalidad declareFunction(QName name, QName type, QName[] argTypes) Se utiliza cuando el valor de retorno y los argumentos de la función sean valores atómicos únicos El tipo QNames debe hacer referencia a los tipos incorporados o tipos globales declarados en un esquema que se ha registrado en la instancia XFactory que se utiliza para crear la instancia XStaticContext. Si un QName hace referencia a un tipo no atómico, el procesador lo tratará como el tipo element(*, ns:type), donde ns:type es el QName indicado. La interfaz XTypeConstants tiene disponibles constantes adecuadas que proporcionan un objeto QName para cada tipo incorporado.
declareFunction(QName name, XSequenceType type, XSequenceType[] argTypes) Se utiliza cuando cualquiera de los argumentos o el valor de retorno de la función es un nodo o una secuencia de valores atómicos o nodos En el ejemplo siguiente se muestra cómo preparar una expresión XPath que utiliza una función externa.// 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);
- Para ejecutar una expresión XPath que utiliza funciones externas, proporcione (o enlace) los métodos Java que implementan las funciones utilizando una instancia XDynamicContext.
Utilice el reflejo Java para obtener un objeto java.lang.reflect.Method para la función. Si el método es un método de instancia, será necesario un objeto de instancia cuando se enlace esta función.
Se llega a un error si no se proporciona un método Java para una función que se utiliza al ejecutar la expresión XPath.
XDynamicContext tiene dos métodos bindFunction. Cada uno de ellos requiere un objeto QName correspondiente al nombre de la función y un objeto Method que identifica el método Java que proporcionará la implementación de la función.Tabla 2. Métodos bindFunction de XDynamicContext. En esta tabla se explica cuándo se utiliza cada forma de los métodos bindFunction de XDynamicContext.
Nombre del método Finalidad bindFunction(QName qname, Method method) Se utiliza cuando se enlaza un método estático bindFunction(QName qname, Method method, Object instanceObject) Se utiliza cuando se enlaza un método de instancia El ejemplo siguiente ejecuta la expresión XPath preparada en el primer ejemplo, enlazando primero un método para la función que utiliza. En este ejemplo, el método pow(double a, double b) estático de la clase java.lang.Math se utiliza para proporcionar la implementación de la función externa.// 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
File name: txml_funcs_xpath.html