You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅使用XPath 1.0如何对多个同名属性值做正则匹配校验?

解决方案

可以通过XPath 1.0实现该校验规则,由于XPath 1.0没有原生正则匹配能力和every量词,我们可以通过自带的字符串处理函数+反向匹配逻辑实现需求。

核心实现思路

SonarQube自定义XML规则的触发逻辑是:只要XPath表达式匹配到了节点,就会触发质量告警。因此我们不需要正向判断所有属性都符合要求,只需要匹配存在不符合要求的属性的节点即可。

判断属性d的值为纯数字的XPath 1.0逻辑:
使用translate()函数把属性值里的所有数字替换为空,如果替换后结果也为空,说明原属性值全为数字,表达式如下:

translate(@d, '0123456789', '') = ''

最终可用规则表达式

触发告警用表达式(适配SonarQube规则)

直接匹配所有d属性不是纯数字的<c>节点,匹配到即触发告警:

/a/b/c[@d and translate(@d, '0123456789', '') != '']

表达式里的@d判断是为了过滤没有d属性的<c>节点,避免误报,如果你的业务场景要求所有<c>必须带d属性可以保留,否则可以去掉。

布尔值返回表达式

如果你需要拿到全局判断结果(所有d都是纯数字返回true,否则返回false),可以用以下表达式:

not(/a/b/c[@d and translate(@d, '0123456789', '') != ''])

效果验证

针对你给出的示例XML,上述触发告警用表达式会精准匹配到最后一个d="xyz"的<c>节点,符合你的校验需求。

内容的提问来源于stack exchange,提问作者M_B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:24:00