【发布时间】:2012-03-18 14:54:01
【问题描述】:
谁能解释一下 text() 和 string() 函数的区别。我经常用一个和另一个,但没有任何区别,两者都会得到xml节点的字符串值。
【问题讨论】:
标签: xpath
谁能解释一下 text() 和 string() 函数的区别。我经常用一个和另一个,但没有任何区别,两者都会得到xml节点的字符串值。
【问题讨论】:
标签: xpath
谁能解释一下 text() 和 string() 的区别 功能。
我。 text() 不是函数,而是node test。
用于选择上下文节点的所有文本节点子节点。
所以,如果上下文节点是一个名为x 的元素,那么text() 会选择x 的所有文本节点子节点。
其他示例:
/a/b/c/text()
选择作为顶部元素a 的子元素的任何b 元素的子元素的任何c 元素的所有文本节点子元素。
二。 string() 函数
根据定义string(exprSelectingASingleNode)返回节点的string value。
元素的字符串值是其所有文本节点后代的串联——按文档顺序。
因此,如果在以下 XML 文档中:
<a>
<b>2</b>
<c>3
<d>4</d>
</c>
5
</a>
string(/a) 返回(不带引号):
"
2
3
4
5
"
正如我们所见,字符串值反映了三个纯空白文本节点,我们通常不会注意到和解释。
一些 XML 解析器可以选择去除纯空白文本节点。如果上面的文档是在剥离纯空白文本节点的情况下解析的,那么同样的功能:
string(/a)
现在返回:
"23
4
5
"
【讨论】:
大多数情况下,如果您想要元素节点 X 的内容,可以将其称为“.”,如果它是上下文节点,或者如果它是上下文节点的子节点,则称为“X”。例如:
<xsl:if test="X = 'abcd'">...
或
<xsl:value-of select="."/>
在这两种情况下,因为上下文需要一个字符串,所以会自动应用 string() 函数。 (这稍微简化了一点,如果您运行的是模式感知 XSLT 2.0,那么规则会稍微复杂一些)。
这里不需要使用“string()”,因为它是自动完成的;并且使用text() 是一个错误(这种错误似乎越来越普遍,受到网络上一些糟糕教程的鼓励)。在这种情况下使用./text() 或X/text() 会为您提供该元素的所有文本节点子节点。通常元素有一个文本节点子节点,其字符串值恰好与元素的字符串值相同,但如果有人添加注释或处理指令,您的代码将失败,因为该值随后被拆分为多个文本节点。如果元素是一个允许混合内容的元素(比如“title”),它也会失败:string(title) 和 title/text() 会给出相同的答案,直到你点击标题的文章
<title>On the wetness of H<sub>2</sub>O</title>
【讨论】:
<a>{x/y/z}</a> 是最臭名昭著的例子;另一个是 instance of)没有隐式原子化,因此应该手动完成:使用 string() 或data() 几乎总是比使用 /text() 更好。