fn:XPathExpressions中的函数导致JDK1.6中的异常

时间:2010-11-02 13:50:30

标签: java function xpath

我想使用XPath从这样的文档中选择第一个“href”属性的值:

<div>
  <a href="#a">
    <span>foo</span>
  </a>

  <a href="#b">
    <span>bar</span>
  </a>

  <a href="#c">
    <span>baz</span>
  </a>
</div>

但是,我只对那些管理文本内容为“bar”或“baz”的跨度的a元素感兴趣。我希望通过以下Java代码实现这一点:

Document document = getDocument(); // returns non-null Document

XPath xpath = XPathFactory.newInstance().newXPath();
String href = xpath.evaluate("//a[fn:matches(span, '^ba.$')]/attribute::href", document);

但每当我在XPathExpression中使用其中一个fn:函数时,我都会

javax.xml.transform.TransformerException: Unknown error in XPath.
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:363)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:301)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:210)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:275)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:365)
    at MyCode(MyCode.java:71)
Caused by: java.lang.NullPointerException
    at com.sun.org.apache.xpath.internal.functions.FuncExtFunction.execute(FuncExtFunction.java:206)
    at com.sun.org.apache.xpath.internal.axes.PredicatedNodeTest.executePredicates(PredicatedNodeTest.java:340)
[...]

使用fn:starts-with时会抛出类似的异常。我在GNU / Linux上使用JDK 1.6。

任何想法我做错了什么?谢谢!

3 个答案:

答案 0 :(得分:4)

这些字符串函数在XPath 2.0中可用,Java XPath API不支持。您将不得不使用另一个库Saxon来评估XPath 2.0表达式:

答案 1 :(得分:2)

默认情况下,仅支持核心xpath函数1.0(http://www.w3.org/TR/xpath/#corelib)(如此处所述:http://download.oracle.com/javase/6/docs/api/javax/xml/xpath/XPathFunctionResolver.html)。

因此,您应该使用matches(http://www.w3.org/TR/xpath/#function-contains)代替contains

答案 2 :(得分:1)

首先,如果使用前缀(fn),则应将其绑定到名称空间URI。

其次, XPath 1.0函数不使用前缀绑定。这将被解释为扩展函数调用。

第三,match()是XPath 2.0函数。

在XPath 1.0中,此表达式应该起作用:

/div/a[span[starts-with(.,'ba')]][1]/@href

如果您使用//步骤运算符,则应使用:

(//a[span[starts-with(.,'ba')]])[1]/@href