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
知道我做错了什么吗?谢谢
# 1 楼答案
这些字符串函数在XPath2.0中可用,Java XPath API不支持这些函数。您必须使用另一个库(如Saxon)来计算XPath 2.0表达式:
# 2 楼答案
首先,如果使用前缀(
fn
),则应将其绑定到命名空间URI其次,XPath1.0函数不使用前缀绑定。这将被解释为一个扩展函数调用
第三,
match()
是一个XPath2.0函数在XPath 1.0中,此表达式应适用于:
如果使用
//
步骤运算符,则应使用:# 3 楼答案
只有核心xpath函数1.0(http://www.w3.org/TR/xpath/#corelib)默认情况下支持(如下所述:http://download.oracle.com/javase/6/docs/api/javax/xml/xpath/XPathFunctionResolver.html)
因此,您应该使用
contains
而不是matches
(http://www.w3.org/TR/xpath/#function-包含)