查找以特定模式开头的属性名称

问题描述 投票:23回答:3

我希望找到与某个模式匹配的元素的所有属性。

所以对于一个元素

<element s2="1" name="aaaa" id="1" />
<element s3="1" name="aaaa" id="2" />

我希望能够找到以's'开头的所有属性(为第一个元素返回s1的值,为第二个元素的值返回s3)。

如果这超出了xpath的能力,请告诉我。

xpath
3个回答
37
投票

使用:

element/@*[starts-with(name(), 's')]

此XPath表达式选择名称以字符串's'开头的所有属性节点,它们是名为element的元素的属性,这些元素是当前节点的子节点。

starts-with()是XPath 1.0中的标准函数


3
投票
element/@*[substring(name(), 1,1) = "s"]

将匹配任何以's'开头的属性。

函数starts-with()可能看起来比使用substring()更好


2
投票

我已经使用Python中的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()

© www.soinside.com 2019 - 2024. All rights reserved.