Php 这两个XPath查询之间的差异

Php 这两个XPath查询之间的差异,php,xml,xpath,xpath-2.0,Php,Xml,Xpath,Xpath 2.0,我不明白为什么我们应该使用text()而不是仅仅使用“” 有什么区别 //library/book/author[text() = "An Author"] vs //span[@class="whateverclass"][. = "An Author"] 提供当前节点和所有子节点的文本 text()仅提供当前节点的文本 结论:如果要检查节点中的文本,请使用text(),因为使用也将检查所有潜在子节点的文本示例可能最能说明这一差异,其中一个元素有一个或多个子元素和多个文本元素(一个元素允许

我不明白为什么我们应该使用text()而不是仅仅使用“” 有什么区别

//library/book/author[text() = "An Author"]
vs

//span[@class="whateverclass"][. = "An Author"]

提供当前节点和所有子节点的文本

text()
仅提供当前节点的文本


结论:如果要检查节点中的文本,请使用
text()
,因为使用
也将检查所有潜在子节点的文本

示例可能最能说明这一差异,其中一个元素有一个或多个子元素和多个文本元素(一个元素允许多个文本元素散布在子元素之间):


文本1
儿童1文本1
文本2
假设
元素
为当前元素:

  • 将返回
    text1 child1text1 text2
    (带空格)
  • text()[1]
    将返回
    text1
  • text()[2]
    将返回
    text2
特别要注意的是
text()
在XSLT1.0和XSLT2.0中的表现不同

  • text()
    在XSLT1.0中只返回
    text1
  • text()
    返回XSLT2.0中的
    text1 text2
    (带空格)

是一个节点集,包含一个节点,即当前上下文节点(示例中的
span
元素节点)。该节点的字符串值是其所有子代文本节点的串联,因此如果

<span class="whateverclass">Ann <b>A.</b> Author</span>

但不匹配
[text()='Ann A.Author']

通常不应使用text()。使用“.”组合字符串值,忽略注释和处理说明,而使用text()可以根据注释出现的位置将文本分为几部分。仅当您希望一次处理一部分混合内容时才使用文本。

text()
选择的节点集/顺序在xpath 1.0和2.0中都是相同的(它是两个文本节点的顺序),区别在于该序列转换为字符串的方式。即使在xpath 2.0
元素[text()='text1 text2']
将不匹配此
元素
,因为序列中没有一个节点具有该字符串值。@Ian感谢您的澄清-我可以确认差异的原因是由于结果树片段(1)与节点集(2)的字符串序列化不同吗不完全是这样。区别在于,在XSLT 1.0中,当你说
foo
是一个包含多个节点的节点集时,结果是集中第一个节点的字符串值,而在XSLT 2.0中,它是由空格分隔的所有节点的字符串值的串联。
<span class="whateverclass">Ann <b>A.</b> Author</span>
span[@class='whateverclass'][. = 'Ann A. Author']
span[@class='whateverclass'][text() = 'Ann ']
span[@class='whateverclass'][text() = ' Author']