为何XPath表达式contains(text(),'substring')无法按预期正常工作?
XPath中
text()在等值判断和contains()中的行为差异原因 根本原因是XPath中不同语法结构对参数的基数(允许的取值数量)要求不同:
1. 等值判断text() = 'xxx'生效的原因
=是XPath的通用比较操作符,天然支持多值匹配:当左侧的text()返回多个文本节点组成的列表时,操作符会自动遍历列表中的每一个节点,只要任意一个节点的字符串值和右侧值相等,整个判断结果就为真。
你给出的示例<a>标签下存在两个独立的直接子文本节点Ask Question和more text,所以两个等值判断都能命中对应的文本节点,不会报错。
2. contains(text(), 'xxx')报错的原因
contains()是XPath的内置函数,它的第一个入参明确要求基数为0或1,也就是只能传入单个字符串/节点,不支持自动遍历多值列表。
当上下文节点下存在多个文本节点时,text()返回的是长度≥2的节点列表,传入contains()后不符合参数要求,就会抛出Required cardinality of first argument of contains() is one or zero的错误。
正确的部分匹配写法
- 如果你要匹配任意直接子文本节点包含目标内容,可以显式遍历每一个文本节点:
//a[text()[contains(., 'Ask Question')]] - 如果你要匹配节点下所有拼接后的文本(包括后代节点的文本)包含目标内容,直接用点号代替
text()即可://a[contains(., 'Ask Question')]
内容的提问来源于stack exchange,提问作者Jakob Busk Sørensen
相关产品推荐
相关产品推荐

