2

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

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

对比

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

4 回答 4

2

你通常不应该使用 text()。使用 ”。” 组装字符串值,忽略注释和处理指令,而 text() 可以根据注释出现的位置将文本分成几部分。仅当您想一次处理一个混合内容时才使用文本。

于 2012-12-17T11:48:41.963 回答
2

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

text()只给你当前节点的文本

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

于 2012-12-17T10:44:50.477 回答
2

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

<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']

于 2012-12-17T10:54:02.593 回答
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()text1在 xslt 1.0 中返回
  • text()text1 text2在 xslt 2.0 中返回(带空格)
于 2012-12-17T10:51:24.517 回答