这两个XPath查询之间的区别

时间:2012-12-17 10:38:25

标签: php xml xpath xpath-2.0

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

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

VS

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

.是一个包含单个节点的节点集,即当前上下文节点(示例中为span元素节点)。这个字符串的值是它所有后代文本节点的串联,所以如果你有

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

这将是字符串"Ann A. Author"(不带引号)。

text()是一个节点集,包含上下文节点的所有直接子文本节点(上例中的两个节点"Ann "" Author")。如果任何节点具有给定的字符串值,则=比较,其中一边是节点集,另一边是字符串,因此上面的示例<span>元素会匹配任何模式

span[@class='whateverclass'][. = 'Ann A. Author']
span[@class='whateverclass'][text() = 'Ann ']
span[@class='whateverclass'][text() = ' Author']

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

答案 2 :(得分:2)

通常不应该使用text()。使用“。”汇编字符串值,忽略注释和处理指令,而text()可以根据注释的出现位置将文本拆分为多个部分。只有在想要一次处理一个混合内容时才使用文本。

答案 3 :(得分:1)

差异可能最好用一个例子来说明,其中一个元素有一个或多个子元素,以及多个文本元素(一个元素允许多个文本元素散布在子元素之间):

<element>
  text1
  <child>
     child1text1
  <child>
  text2
</element>

假设element是最新的:

  • . 将返回text1 child1text1 text2(包含空格)
  • text()[1] 将返回text1
  • text()[2] 将返回text2

特别值得注意的是text()在xslt 1.0与xslt 2.0中的行为方式不同

  • text() 仅在xslt 1.0中返回text1
  • text() 在xslt 2.0中返回text1 text2(带空格)