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

  1. 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);
  2. 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));

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_xpath
File name: txml_funcs_xpath.html