有人可以解释text()和string()函数之间的区别.我经常使用其中一个,但它没有任何区别,两者都将获得xml节点的字符串值.
Dim*_*hev 52
有人可以解释text()和string()函数之间的区别.
I. text()不是功能而是节点测试.
它用于选择上下文节点的所有文本节点子节点.
因此,如果上下文节点是一个名为的元素x,则text()选择所有文本节点子节点x.
其他例子:
/a/b/c/text()
Run Code Online (Sandbox Code Playgroud)
选择作为top元素的子元素c的子元素的任何元素的所有text-node子b元素a.
II.该string()功能
根据定义,string(exprSelectingASingleNode)返回节点的字符串值.
元素的字符串值是所有文本节点后代的串联 - 按文档顺序排列.
因此,如果在以下XML文档中:
<a>
<b>2</b>
<c>3
<d>4</d>
</c>
5
</a>
Run Code Online (Sandbox Code Playgroud)
string(/a) 返回(没有周围的引号):
"
2
3
4
5
"
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,字符串值反映了三个仅限空格的文本节点,我们通常无法注意到这些节点.
一些XML解析器可以选择剥离仅限空白的文本节点.如果上面的文档是使用剥离的仅空白文本节点解析的,那么相同的函数:
string(/a)
Run Code Online (Sandbox Code Playgroud)
现在返回:
"23
4
5
"
Run Code Online (Sandbox Code Playgroud)
Mic*_*Kay 11
大多数情况下,如果您想要元素节点X的内容,您可以将其称为".",如果它是上下文节点,或者如果它是上下文节点的子节点则称为"X".例如:
<xsl:if test="X = 'abcd'">...
Run Code Online (Sandbox Code Playgroud)
要么
<xsl:value-of select="."/>
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,由于上下文需要字符串,因此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>
Run Code Online (Sandbox Code Playgroud)