XPath中contains()谓词测试之间的区别?

时间:2017-03-27 14:15:32

标签: xml xpath

如何解释这两个XPath表达式之间的区别?

表达式1:

//div[contains(@class, 'Test')]

表达式2:

//div[@class[contains(.,'Test')]]

3 个答案:

答案 0 :(得分:3)

1 没有区别。在XPath的所有版本中,包括XPath 1.0,两个XPath都将为所有XML文档选择完全相同的节点集:具有div属性的所有@class元素,其字符串值包含{{1 }}

使用第一个表格;它既短而且更惯用。

1 除非在支持XPath 2.0架构感知类型信息的宿主语言的上下文中评估XPath,否则请参阅Michael Kay's answer

答案 1 :(得分:1)

实际上存在差异,但非常微妙。如果表达式是XPath 2.0架构感知表达式,并且@class在架构中定义为列表值,并且如果列表中有多个项目,则//div[contains(@class, 'Test')]将失败并出现类型错误,当且仅当其中一个项目//div[@class[contains(.,'Test')]]为子字符串时,Test将返回true。

答案 2 :(得分:0)

表达式1:

//div[contains(@class, 'Test')]
  1. 当前上下文节点为div标记
  2. []是过滤器以获取特殊div标记
  3. contains(@class, 'Test')是一个返回boolTrueFalse的字符串函数,它会将参数转换为字符串值。属性的字符串值是其text.so XPath是:选择所有div标签,当它的class属性评估为True时。
  4. 表达式2:

    //div[@class[contains(.,'Test')]]
    
    1. 当前上下文节点为div标记
    2. []是过滤器以获取特殊div标记
    3. 过滤器中的
    4. ,当前上下文节点是属性节点class
    5. [contains(.,'Test')]将使用字符串值Test过滤class属性。左边部分是//div[filtered class node],因此XPath变为:选择带有这些过滤类属性的所有div标记。