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

标签 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 表达式中使用小写字母,以便返回序列中的名称已经小写?我不想在每个项目上使用 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"/> 

最佳答案

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'),但这仅适用于单个值。

关于java - XPath lower-case() 获取小写值的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17368189/

相关文章:

xml - 如何检查元素节点是否包含xsl中的特定值

java - 如何分隔与字符串输入的 float ?

java - JNI 和 Java : ant calling make or make calling ant?

xslt - 相同的 xpath 在命令行上有效,但在 xslt 中无效

java - 如何使用java为XML中的节点生成Xpath?

xslt - 如何在 XPATH 2.0 中使用 "<<"运算符?

java - Wildfly 8.1 - 在没有standalone.xml的情况下设置系统属性

java - android中类似于iOS的VOIP推送和调用套件的调用

javascript - 从节点 XSLT 中删除所有\n\r 字符?

xml - XPath child::* 与 child::node()