【发布时间】:2012-12-17 10:38:24
【问题描述】:
我不明白为什么我们应该使用 text() 而不是只使用 "." 有什么区别?
//library/book/author[text() = "An Author"]
vs
//span[@class="whateverclass"][. = "An Author"]
【问题讨论】:
我不明白为什么我们应该使用 text() 而不是只使用 "." 有什么区别?
//library/book/author[text() = "An Author"]
vs
//span[@class="whateverclass"][. = "An Author"]
【问题讨论】:
. 为您提供当前节点和所有子节点的文本
text() 只给你当前节点的文本
结论:如果你想检查节点中的文本,请使用text(),因为使用.,你也会检查所有潜在子节点的文本
【讨论】:
. 是一个包含单个节点的节点集,即当前上下文节点(您的示例中的 span 元素节点)。 this 的字符串值是其所有后代文本节点的串联,所以如果你有
<span class="whateverclass">Ann <b>A.</b> Author</span>
这将是字符串"Ann A. Author"(不带引号)。
text() 是一个节点集,包含上下文节点的所有直接子文本节点(上例中的两个节点 "Ann " 和 " Author")。 = 比较其中一侧是节点集,另一侧是字符串,如果 any 节点具有给定的字符串值,则为真,因此上述示例 <span> 元素将匹配任何模式
span[@class='whateverclass'][. = 'Ann A. Author']
span[@class='whateverclass'][text() = 'Ann ']
span[@class='whateverclass'][text() = ' Author']
但会不匹配[text() = 'Ann A. Author']
【讨论】:
你通常不应该使用 text()。使用 ”。”组装字符串值,忽略 cmets 和处理指令,而 text() 可以根据 cmets 出现的位置将文本分成几部分。仅当您想一次处理一个混合内容时才使用文本。
【讨论】:
这个区别可能最好用一个例子来说明,其中一个元素有一个或多个子元素,以及多个文本元素(一个元素允许多个文本元素散布在子元素之间):
<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(带有空格)【讨论】:
text() 选择的节点集/序列在 xpath 1.0 和 2.0 中都是相同的(它是两个文本节点的序列),不同之处在于这个序列转换为字符串的方式.即使在 xpath 2.0 中,element[text() = 'text1 text2'] 也不会匹配此 element,因为序列中没有单个节点具有该字符串值。
<xsl:value-of select="foo"/> 和 foo 是一个包含多个节点的节点集时,结果是该集中第一个节点的字符串值,而在 XSLT 2.0 中,它是所有个节点的字符串值,以空格分隔。