有没有办法仅使用 XPATH 1.0 将多个相同命名的属性与正则表达式字符串匹配?
Posted
技术标签:
【中文标题】有没有办法仅使用 XPATH 1.0 将多个相同命名的属性与正则表达式字符串匹配?【英文标题】:Is there a way to match multiple, same named attributes with a regex string using XPATH 1.0 only? 【发布时间】:2021-11-15 14:46:03 【问题描述】:我的团队目前正在利用 SonarQube 对我们的 Mulesoft API 实施进行代码质量检查。 SonarQube 使用 XPATH 1.0 在 mule 4 代码上创建自定义规则。 我们目前面临的问题是,如果存在具有相同命名属性的相同命名元素,则没有明确的方式循环它们并将它们的值与正则表达式匹配。 例如:
<a>
<b>
<c d='123'></c>
</b>
<b>
<c d='123'></c>
</b>
<b>
<c d='123'></c>
</b>
<b>
<c d='xyz'></c>
</b>
</a>
规则是确定所有属性“d”是否仅使用数字。这条规则可以使用 XPATH 2.0 来完成,因此:
every $value in /a/b/c/@d satisfies matches($value, '^\d+$')
但是,由于这在 SonarQube 中无效,在 XPATH 1.0 中是否可以实现此规则?
【问题讨论】:
【参考方案1】:不,XPATH 1.0 不支持正则表达式。 请参阅this 或this 讨论。 有一些解决方法也提到了here 或更多其他地方。
【讨论】:
【参考方案2】:XPath 1.0 中的正则表达式无法做到这一点。
但是你可以检查一个字符串是否只包含(ascii)数字
translate(@x, '0123456789', '') = ''
你可以这样进行全称量化:
not(/a/b/c[not(translate(@x, '0123456789', '') = '')])
或者通过利用字符串到布尔转换,如:
not(/a/b/c[translate(@x, '0123456789', '')])
【讨论】:
以上是关于有没有办法仅使用 XPATH 1.0 将多个相同命名的属性与正则表达式字符串匹配?的主要内容,如果未能解决你的问题,请参考以下文章