我们知道,<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文件:
< 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:template match= "/" >
    <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元素。