将谓词应用于xpath中的字符串为何有效?

时间:2018-08-22 14:50:18

标签: css xpath

我无法通过谷歌搜索找到任何答案。一位同事将CSS和xpath谓词混合在一起,并产生了以下xpath:

$x("//*[contains(@class, 'btn'[someattr='somevalue'])]")

此xpath返回文档中的所有元素。

我最好的理解是,可以将谓词应用于字符串('btn'),并且该谓词与字符串不匹配,从而导致第二个参数“包含”为空。然后,这将匹配所有元素,因为它们的类属性至少不包含任何内容。

但这为什么合法?

有没有一种方法可以构造与字符串值匹配的谓词,从而使第二个参数不为空?我尝试了类似'btn'[text()='btn']之类的方法,但得到的结果与之前的表达式相同。

1 个答案:

答案 0 :(得分:2)

这在XPath 2.0中合法,但在1.0中不合法。

在XPath 1.0中,该语法允许将谓词应用于任何表达式,但是类型规则说,如果表达式对除节点集以外的值求值,这是一个错误。 (这是许多语言中的通用方法,可以使语法保持正交,但在类型系统中定义有关可以将哪些运算符应用于哪些值的规则。)

在XPath 2.0中,所有值都是序列,并且任何序列都可以由谓词过滤,因此过滤字符串序列非常有意义,并且由于单个字符串本身就是字符串序列,因此没有理由禁止这种情况。实际上,它很有用,我经常使用它:考虑:

print("Found " || $n || " error" || "s"[$n gt 1])

即使在XPath 2.0中,您的示例也会失败,因为谓词someattr='somevalue'的lhs表示child::someattr,并且上下文项为字符串时您不能使用轴表达式。