我有这样的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'," +
"'abcdefghijklmnopqrstuvwxyz')='b2']");
ret_nodelist = (NodeList) xPathExpression.evaluate(doc,XPathConstants.NODESET);
答案 0 :(得分:3)
translate
函数对字符串进行操作,因此它首先强制它的字符串参数然后转换结果。在您使用它的上下文中Book
有一个包含三个节点的节点集,并且节点集的字符串值是其第一个成员的值,因此您的表达式为整体意味着“找到所有第一本书孩子都是b1(不区分大小写)的作者”。
相反,你需要像
这样的东西Author[Book[translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='b1']]
“查找所有任何 Book child的作者,其值为b1(不区分大小写)”