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

Xml XPath中的contains()谓词测试之间的区别?,xml,xpath,Xml,Xpath,如何解释这两个XPath表达式之间的差异 表达式1: //div[contains(@class, 'Test')] //div[@class[contains(.,'Test')]] 表达式2: //div[contains(@class, 'Test')] //div[@class[contains(.,'Test')]] 没有区别。在所有版本的XPath(包括XPath 1.0)中,两个XPath都将为所有XML文档选择完全相同的节点集:所有div元素都具有@class属性,其字符

如何解释这两个XPath表达式之间的差异

表达式1:

//div[contains(@class, 'Test')]
//div[@class[contains(.,'Test')]]
表达式2:

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

使用第一种形式;它既短又地道


1除非在支持XPath 2.0模式感知类型信息的主机语言上下文中计算XPath,否则请参阅。

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

使用第一种形式;它既短又地道


1除非在支持XPath 2.0模式感知类型信息的主机语言上下文中计算XPath,否则请参见。

表达式1:

//div[contains(@class, 'Test')]
  • 当前上下文节点是
    div
    标记
  • []
    是获取特殊
    div
    标记的过滤器
  • contains(@class,'Test')
    是一个字符串函数,返回
    bool
    True
    False
    ,它将参数转换为其字符串值。属性的字符串值是它的文本。因此XPath是:当它的class属性计算为True时,选择所有div标记。
  • 表达2:

    //div[@class[contains(.,'Test')]]
    
  • 当前上下文节点是
    div
    标记
  • []
    是获取特殊
    div
    标记的过滤器
  • 在过滤器中,当前上下文节点是属性节点
    class
  • [包含(,'Test')]
    将用字符串值
    Test
    过滤class属性。左边的部分是
    //div[filtered class node]
    ,因此XPath变成:选择所有带有这些filtered class属性的div标记。表达式1:

    //div[contains(@class, 'Test')]
    
  • 当前上下文节点是
    div
    标记
  • []
    是获取特殊
    div
    标记的过滤器
  • contains(@class,'Test')
    是一个字符串函数,返回
    bool
    True
    False
    ,它将参数转换为其字符串值。属性的字符串值是它的文本。因此XPath是:当它的class属性计算为True时,选择所有div标记。
  • 表达2:

    //div[@class[contains(.,'Test')]]
    
  • 当前上下文节点是
    div
    标记
  • []
    是获取特殊
    div
    标记的过滤器
  • 在过滤器中,当前上下文节点是属性节点
    class

  • [包含(,'Test')]
    将用字符串值
    Test
    过滤class属性。左边的部分是
    //div[filtered class node]
    ,因此XPath变成:选择所有带有这些filtered class属性的div标记。

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

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

    对于记录,两个表达式是否都在XPath 1中工作?或者这两个选项中的一个只在XPath2中起作用吗?这两个选项在所有XPath版本(包括XPath1.0)中都起相同的作用。答案已更新。请注意,这两个表达式是否都适用于XPath 1?或者这两个选项中的一个只在XPath2中起作用吗?这两个选项在所有XPath版本(包括XPath1.0)中都起相同的作用。答案已更新。在XPath(2.0或其他)级别定义的架构感知是否独立于XSLT?XPath 2.0定义为处理类型化(即架构验证)和非类型化数据,但让宿主语言(如XSLT)定义具有不同功能级别的语言子集。架构感知是否在XPath(2.0或其他)级别定义级别独立于XSLT?XPath 2.0定义为处理类型化(即模式验证)和非类型化数据,但将定义具有不同功能级别的语言子集留给宿主语言(如XSLT)。