1

我有只有一些节点的 XML 文件。无论如何,节点有很多属性。我正在查询包含特定关键字的属性。

String expression = "/posts/row[@PostTypeId='1' and @*[contains(.,'Security')]]";

这工作正常,但只能找到与大写“S”的完全匹配。我想让用户提供关键字,而他们是否只使用小写字母不在我的手中。我想做的是使用

//posts/row[translate(@*, ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’, ‘abcdefghijklmnopqrstuvwxyz’)]

使 XML 端的所有内容以及关键字都小写,并将两种尝试组合成一个表达式。

这是我的尝试,但不起作用

String expression = "/posts/row[@*[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '" + keyword + "')]]";

有人可以帮我吗?我的尝试完全错了吗?

提前致谢, 博多


看来我可以同时用以下方法解决这个问题

String expression = "/posts/row[@PostTypeId='1' and @*[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '" + keyword + "')]]";

我不知道是什么使它现在起作用,所以任何人都可以对此有所了解吗?

4

1 回答 1

0

您非常接近,但您提到将关键字转换为小写但从未这样做。您必须申请translate两次。我添加了一些空格以提高可读性,您可以将所有内容再次放在一行中($keyword当然,替换为您使用的字符串连接):

/posts/row[
  @PostTypeId='1' and @*[
    contains(
      translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
      translate($keyword, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')
    )
  ]
]

确保不要忘记任何非 ascii 字符,例如德语变音符号或其他口音!实现这样的关键字可能会很烦人。XPath 2.0 知道lower-case(...)哪个支持 unicode。

于 2013-12-11T22:15:21.140 回答