我想使用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。
任何想法我做错了什么?谢谢!
答案 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