如何在XSLT中创建不是文档片段的变量?

时间:2010-06-08 11:49:15

标签: variables xslt-2.0 documentfragment

考虑以下XSLT 2.0模板

<xsl:template match="/">
    <xsl:variable name="var1">
        <elem>1</elem>
        <elem>2</elem>
        <elem>3</elem>
    </xsl:variable>
    <xsl:text>var1 has </xsl:text>
    <xsl:value-of select="count($var1)"/>
    <xsl:text>elements.
    </xsl:text>

    <xsl:variable name="var2" select="$var1/elem[position() &gt; 1]"/>
    <xsl:text>var2 has </xsl:text>
    <xsl:value-of select="count($var2)"/>
    <xsl:text>elements.
    </xsl:text>
</xsl:template>

此模板的输出是

var1 has 1 elements
var2 has 2 elements

第一行输出1(而不是,正如我首先预期的那样3),因为var1是一个文档片段,其中包含<elem>元素作为childen。现在我的问题:

如何创建不包含文档片段的变量?我可以像使用var2那样创建它,只留下谓词。但也许有一种方法没有使用第二个变量。或者,作为替代方案:如何在过滤掉某些元素的同时将文档片段保留在变量中?

背景信息:我将在递归函数中使用变量内容,该函数检查var1中的第一个元素是否符合某些条件。如果满足条件或元素列表为空,则返回值。否则,它将调用自身,并移除var1的第一个元素(就像我在var2中所做的那样)。使用var1作为包含文档片段的参数时,模板中的XPath表达式将不匹配。

1 个答案:

答案 0 :(得分:1)

  

如何创建一个可变的变量   不包含文档片段?

使用:

<xsl:variable name="var1" as="element()*"> 
    <elem>1</elem> 
    <elem>2</elem> 
    <elem>3</elem> 
</xsl:variable> 
  

如何保存文档   过滤时变量中的片段   一些元素?

如果您有:

<xsl:variable name="var1"> 
    <elem>1</elem> 
    <elem>2</elem> 
    <elem>3</elem> 
</xsl:variable> 

使用:

  <xsl:variable name="var2">
    <xsl:copy-of select="$var1/*[. mod 2 = 1]"/>
  </xsl:variable>