XPath lower-case()获取小写值的集合

时间:2013-06-28 15:19:57

标签: java xpath xpath-2.0

鉴于XML实例:

<fruits>
    <fruit>Apple</fruit>
    <fruit>Orange</fruit>
    <fruit>Banana</fruit>
</fruits>

我正在使用循环:

XPathExpression expr = xpath.compile("/fruits/fruit/text()");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0 ; i < nodes.getLength() ; i++) 
    System.out.println(nodes.item(i).getNodeValue());

打印水果名称列表。有没有办法在外部XPath表达式中使用lower-case,以便返回的序列中的名称​​已经小写?我不想使用String toLowerCase() Java方法或在每个项目上调用lower-case()函数,如下所示:

System.out.println(xpath.compile("lower-case(.)").evaluate(nodes.item(i)));

...有没有办法在一个XPath表达式中实现它,只对外部循环计算一次?

我的常春藤文件中有以下Saxon依赖项,因此我也可以访问XPath 2.0功能:

<dependency org="net.sf.saxon" name="Saxon-HE" rev="9.4"/> 

1 个答案:

答案 0 :(得分:2)

Java仅支持XPath 1.0

Plain Java的XPath评估程序不支持XPath 2.0,因此您根本无法使用fn:lower-case(...)。对每个结果使用Java的toLowerCase()函数。

如果你有XPath 2.0

如果您正在使用其他一些XPath引擎,您可以使用此表达式将每个水果名称转换为小写,并仍然接收单个水果名称:

/fruits/fruit/text()/lower-case(.)

在XPath 1.0中模拟fn:lower-case(...)

您所能做的只是使用translate(some-string, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),但这仅适用于单个值。