2

给定 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());

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

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

...有没有一种方法可以在一个 XPath 表达式中实现这一点,外循环只评估一次?

我的Ivy文件中有以下 Saxon 依赖项,因此我还可以访问 XPath 2.0 功能:

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

1 回答 1

2

Java 仅支持 XPath 1.0

Plain Java 的 XPath 求值器不支持 XPath 2.0,所以根本不能使用fn:lower-case(...)toLowerCase()对每个结果使用 Java 的函数。

如果您有 XPath 2.0

如果您正在使用其他 XPath 引擎,您将使用此表达式将每个水果名称转换为小写,但仍会收到单个水果名称:

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

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

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

于 2013-06-28T16:48:55.393 回答