将外部函数用于 XPath

使用 XPath 表达式(使用了外部函数)时,使用 XStaticContext 实例声明函数特征符,并使用 XDynamicContext 实例为各个函数提供(或绑定)Java 实现。

过程

  1. 准备 XPath 表达式(使用了外部函数)时,使用 XStaticContext 实例声明函数特征符。

    XStaticContext 接口具有两种 declareFunction 方法,每种方法具有三个参数:一个参数用于名称,一个参数用于函数的返回类型,一个数组用于自变量的类型。始终将名称作为 QName 对象提供,但类型可以为 QNames 或 XSequenceTypes。函数名称、返回类型和自变量类型必须唯一标识该函数。

    表 1. XStaticContext declareFunction 方法.

    此表说明何时使用各种格式的 declareFunction 方法。

    方法特征符 用途
    declareFunction(QName name, QName type, QName[] argTypes) 用于当函数的返回值和自变量都为单一原子值的情况

    类型 QName 必须引用模式中声明的内置类型或全局类型,此模式已在用于创建 XStaticContext 实例的 XFactory 实例上注册。如果 QName 引用非原子类型,那么处理器会将其视为 type 元素 (*, ns:type),其中 ns:type 是给定的 QName。XTypeConstants 接口具有可用的方便常量,这些常量为各种内置类型提供 QName 对象。

    declareFunction(QName name, XSequenceType type, XSequenceType[] argTypes) 用于在函数的任何自变量或返回值为节点、原子值序列或节点序列的情况
    以下示例说明如何准备使用外部函数的 XPath 表达式。
    // 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. 要执行使用外部函数的 XPath 表达式,请使用 XDynamicContext 实例提供(或绑定)实现函数的 Java 方法。

    使用 Java 反映以获取此函数的 java.lang.reflect.Method 对象。如果方法为实例方法,那么绑定此函数时需要实例对象。

    如果没有为执行 XPath 表达式时使用的函数提供 Java 方法,那么会发生错误。

    XDynamicContext 具有两种 bindFunction 方法。每种方法需要对应于该函数的名称的 QName 对象,以及标识将提供此函数的实现的 Java 方法的方法对象。
    表 2. XDynamicContext bindFunction 方法.

    此表说明何时使用各种格式的 XDynamicContext bindFunction 方法。

    方法名 用途
    bindFunction(QName qname, Method method) 用于绑定静态方法的情况
    bindFunction(QName qname, Method method, Object instanceObject) 用于绑定实例方法的情况
    以下示例执行第一个示例中准备的 XPath 表达式,同时首先绑定它所使用的函数的方法。在此示例中,将 java.lang.Math 类的静态 pow(double a, double b) 方法用于提供外部函数的实现。
    // 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));

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_funcs_xpath
文件名:txml_funcs_xpath.html