XPath中的"ends-with"无法工作

61

我正在尝试查找一个动态id名称的输入元素,它的名称总是以"register"结尾。到目前为止,我尝试了这个:

"//input[@id[ends-with(.,'register')]]"

并且这个

"//input[ends-with(@id,'register')]"

这些都没有产生元素。我做错了什么?同时,这个可以运行:

"//input[@id[contains(.,'register')]]"

这是源代码的一部分:

<td class="input">
<input id="m.f0.menu.f2.volumeTabs.BLOCK_COMMON.tcw.form.register" name="m.f0.menu.f2.volumeTabs.BLOCK_COMMON.tcw.form.register" class="aranea-checkbox" type="checkbox"> </td>

4
你使用的是哪个版本的XPath? - donfuxx
2
除了XPath版本(1.0没有ends-with())外,您还能否向我们展示一些显示问题的XML呢? - Thomas W
1
嗯,不确定 - 我该如何检查版本?我是通过Google Chrome的控制台进行测试的。Chrome使用哪个版本? - casper
1
请至少提供一个可以重现该问题的 XML 示例。id 属性的值末尾是否有空格,从而无法精确地以 'register' 结尾? - har07
可能是为什么xmlstarlet说没有'ends-with'函数?的重复问题。 - Jens Erat
2个回答

125

ends-with 函数是 xpath 2.0 的一部分,但浏览器(您表示正在使用 Chrome 进行测试)通常只支持 1.0。因此,您将不得不使用 string-lengthsubstring 和 equals 的组合自己实现它。

substring(@id, string-length(@id) - string-length('register') +1) = 'register'

4

Ian Roberts在他的解决方案中两次使用了@id属性

在这种情况下,我更喜欢将谓词放在那个@id上,就像这样:

//input[@id[substring(.,string-length(.) - string-length('register') + 1) = 'register']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接