我不明白为什么我们应该使用 text() 而不是只使用“。” 有什么区别?
//library/book/author[text() = "An Author"]
对比
//span[@class="whateverclass"][. = "An Author"]
你通常不应该使用 text()。使用 ”。” 组装字符串值,忽略注释和处理指令,而 text() 可以根据注释出现的位置将文本分成几部分。仅当您想一次处理一个混合内容时才使用文本。
.
为您提供当前节点和所有子节点的文本
text()
只给你当前节点的文本
结论:text()
如果您想检查节点中的文本,请使用,因为.
您也会检查所有潜在子节点的文本
.
是一个包含单个节点的节点集,即当前上下文节点(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']
最好用一个示例来说明这种差异,其中一个元素具有一个或多个子元素和多个文本元素(一个元素允许多个文本元素散布在子元素之间):
<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 中返回(带空格)