如何解释这两个XPath表达式之间的区别?
表达式1:
//div[contains(@class, 'Test')]
表达式2:
//div[@class[contains(.,'Test')]]
答案 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')]
div
标记[]
是过滤器以获取特殊div
标记contains(@class, 'Test')
是一个返回bool
值True
或False
的字符串函数,它会将参数转换为字符串值。属性的字符串值是其text.so XPath是:选择所有div标签,当它的class属性评估为True时。 表达式2:
//div[@class[contains(.,'Test')]]
div
标记[]
是过滤器以获取特殊div
标记class
, [contains(.,'Test')]
将使用字符串值Test
过滤class属性。左边部分是//div[filtered class node]
,因此XPath变为:选择带有这些过滤类属性的所有div标记。