仅使用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
相关产品推荐
相关产品推荐

