有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaFN:XPathExpressions中的函数会导致JDK1中出现异常。6.

我想使用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>

然而,我只对那些a元素感兴趣,这些元素控制文本内容为“bar”或“baz”的跨区。我希望通过以下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上使用JDK1.6

知道我做错了什么吗?谢谢


共 (3) 个答案

  1. # 1 楼答案

    这些字符串函数在XPath2.0中可用,Java XPath API不支持这些函数。您必须使用另一个库(如Saxon)来计算XPath 2.0表达式:

  2. # 2 楼答案

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

    其次,XPath1.0函数不使用前缀绑定。这将被解释为一个扩展函数调用

    第三,match()是一个XPath2.0函数

    在XPath 1.0中,此表达式应适用于:

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

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

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