如何简化相同属性不同值的XPath表达式?
简化相同属性多值匹配的XPath表达式
你尝试的//*[(@name)='first' or 'firstName']不符合XPath语法,无法达到预期效果——因为or运算符两侧必须是布尔表达式,单独的字符串'firstName'会被当作true处理,最终表达式会匹配所有元素,完全偏离需求。
下面是两种可行的简化方案,根据你使用的XPath版本选择:
XPath 2.0+ 版本(推荐)
如果环境支持XPath 2.0或更高版本,可以直接用序列匹配,写法最简洁,完全避免重复书写属性名:
//*[@name=('first', 'firstName')]
这个表达式会精准匹配所有name属性值为'first'或'firstName'的元素。
XPath 1.0 版本
如果只能使用XPath 1.0(很多旧工具/框架只支持1.0),无法完全省略重复的@name,但可以选择以下两种方式:
- 保留清晰的
or写法(这也是最常用的方式,可读性高)://*[@name='first' or @name='firstName'] - 当需要匹配的属性值较多时,可借助
contains和分隔符模拟多值匹配(注意:属性值不能包含你选用的分隔符,比如这里的|):
这种写法减少了重复的//*[contains('|first|firstName|', concat('|', @name, '|'))]@name,但可读性稍差,且存在误匹配风险(比如若有元素name='firstX'也会被匹配),仅适合值较多的场景。
内容的提问来源于stack exchange,提问作者jakub.bitman
相关产品推荐
相关产品推荐

