我希望找到与某种模式匹配的元素的所有属性。
所以对于一个元素
<element s2="1" name="aaaa" id="1" />
<element s3="1" name="aaaa" id="2" />
我希望能够找到所有以's'开头的属性(为第一个元素返回 s1 的值,为 s3 返回值第二个要素)。
如果这超出了xpath的能力,请告诉我。
答案 0 :(得分:37)
使用强>:
element/@*[starts-with(name(), 's')]
此XPath表达式选择名称以字符串's'
开头的所有属性节点,它们是名为element
的元素的属性,它们是当前节点的子节点。
starts-with()
是XPath 1.0中的标准函数
答案 1 :(得分:3)
element/@*[substring(name(), 1,1) = "s"]
将匹配以's'开头的任何属性。
功能starts-with()
可能看起来比使用substring()
答案 2 :(得分:2)
我使用中的 lxml.html 模块测试了来自 @ Dimitre-Novatchev 和 @Ledhund 的给定答案蟒强>
element/@*[starts-with(name(), 's')]
和element/@*[substring(name(), 1,1) = "s"]
都只返回 s2 和 s3 的值。您将无法知道哪个值属于哪个属性。
我认为在实践中,我更感兴趣的是找到包含以特定字符开头的名称属性的元素本身,而不仅仅是它们的值。
要实现这一点非常简单,只需在最后添加/..
,
element/@*[starts-with(name(), "s")]/..
或
element/@*[starts-with(name(), "s")]/parent::*
或
element/@*[starts-with(name(), "s")]/parent::node()
答案 3 :(得分:0)
没有人为我工作。 因此,我没有进行任何更改,但对我有用。 :)
/*:UserCustomField[starts-with(@name, 'purchaseDate')]