我不明白为什么我们应该使用text()而不是只使用“。” 有什么区别?
//library/book/author[text() = "An Author"]
VS
//span[@class="whateverclass"][. = "An Author"]
答案 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
(带空格)