我们知道,<xsl:variable>可以定义变量,而且在使用content赋值时,会生成一个临时结果树。那么,是否content赋值,只能生成临时结果树呢?
XPATH2.0引入了sequence的概念,其实,变量也可以利用content定义为序列。
XML源文件:
<
?xml version="1.0"?
>
< root >
< branch >18 < /branch >
< branch >13 < /branch >
< branch >17 < /branch >
< branch >90 < /branch >
< /root >
我们可以利用如下XSLT文件:
< root >
< branch >18 < /branch >
< branch >13 < /branch >
< branch >17 < /branch >
< branch >90 < /branch >
< /root >
我们可以利用如下XSLT文件:
<
xsl:template
match=
"/"
>
<xsl:variable name="var" as="xs:integer" >
<xsl:sequence select="root/branch"/ >
</xsl:variable >
< xsl:value-of select= "$var" separator= "," / >
< /xsl:template >
将root下所有branch节点的文本组合成一个序列,并赋值给变量var。
<xsl:variable name="var" as="xs:integer" >
<xsl:sequence select="root/branch"/ >
</xsl:variable >
< xsl:value-of select= "$var" separator= "," / >
< /xsl:template >
将root下所有branch节点的文本组合成一个序列,并赋值给变量var。
那么这与
<
xsl:template
match=
"/"
>
<xsl:variable name="var" >
<xsl:value-of select="root/branch"/ >
</xsl:variable >
< xsl:value-of select= "$var" separator= "," / >
< /xsl:template >
有什么区别,我们有必要将变量赋值为序列吗?
<xsl:variable name="var" >
<xsl:value-of select="root/branch"/ >
</xsl:variable >
< xsl:value-of select= "$var" separator= "," / >
< /xsl:template >
有什么区别,我们有必要将变量赋值为序列吗?
第一段xslt代码生成一个序列,序列的每个元素都是xsl:integer类型。
第二段xslt代码生成一个临时结果树,临时结果树由一系列的文本节点组成。
序列相对于临时结果树有以下优点。
1,序列的生成和访问效率都要高于临时结果树。
2,临时结果树会失去数据的类型,因为一旦使用临时结果树,所有数据生成文本节点,文本节点的值的数据类型都是字符型。
但是我们运行第一段代码会报错:
A sequence of more than one item is not allowed as the value of variable $var
原因:
<xsl:variable>的as属性定义为xsl:integer,意为一个integer类型,这就要求<xsl:sequence>所生成的序列只能含有一个integer,但我们实际生成的是4 个integer。
修改办法:
<
xsl:variable
name=
"var"
as=
"xs:integer*"
>
在xsl:integer后加一个星号,表示若干个integer元素。
转载于:https://blog.51cto.com/electiger/19415