XPase查询与incasesensitive

时间:2012-10-08 11:59:56

标签: java xml xpath

我有这样的XML

<Authors>
<Author name='Some Author'>
<Book>B1</Book>
<Book>B2</Book>
<Book>B3</Book>
</Author>
</Authors>

我想通过使用Book对该xml进行xpath查询并显示作者名称,xpath查询应该不区分大小写。

我尝试使用

Author[translate(Book,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='b1'

但是这个查询只有在我用b1查询时才会返回值。如果查询是b2或b3,则返回null。

我在java中这样做:

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
XPathExpression xPathExpression = xPath.compile(
      "Authors/Author[translate(Book,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'," +
      "'abcd‌​efghijklmnopqrstuvwxyz')='b2']");
ret_nodelist = (NodeList) xPathExpression.evaluate(doc,XPathConstants.NODESET);

1 个答案:

答案 0 :(得分:3)

translate函数对字符串进行操作,因此它首先强制它的字符串参数然后转换结果。在您使用它的上下文中Book有一个包含三个节点的节点集,并且节点集的字符串值是其第一个成员的值,因此您的表达式为整体意味着“找到所有第一本书孩子都是b1(不区分大小写)的作者”。

相反,你需要像

这样的东西
Author[Book[translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='b1']]

“查找所有任何 Book child的作者,其值为b1(不区分大小写)”