有没有办法仅使用 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 将多个相同命名的属性与正则表达式字符串匹配?的主要内容,如果未能解决你的问题,请参考以下文章

一次为多个变量分配相同的值?

有没有办法将元素链接转换为 XPath

如何将 XPath 与没有前缀的默认命名空间一起使用?

处理具有相同 XPath 的多个 XML 元素

如何仅抓取多个div中的文本内容[重复]

有没有办法在 JOOQ 中为具有相同表结构的多个模式设置代码生成?