在xslt中下降递归

问题描述:

我想了解xslt中的背景。任何人都可以解释这段代码中发生了什么。在xslt中下降递归

<xsl:template name="factorial"> 
    <xsl:param name="number" select="1"/> 
    <xsl:choose> 
    <xsl:when test="$number <= 1"> 
     <xsl:value-of select="1"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:variable name="recursive_result"> 
     <xsl:call-template name="factorial"> 
      <xsl:with-param name="number" select="$number - 1"/> 
     </xsl:call-template> 
     </xsl:variable> 
     <xsl:value-of select="$number * $recursive_result"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

我不明白为什么我们用<xsl:variable name="recursive_result">包装析因模板。

如果有更清晰的例子可用,请指导我。我缺乏递归知识。

call-template元素包装有variable元素,以便将调用它的结果分配给变量recursive_result

这样做的目的是为了能够在下一行乘以number以产生最终结果。

您不能在XSLT中声明可从脚本的其他部分更改的全局变量。如果您需要模板调用的结果或递归是将生成的结果“打印出”到变量中的唯一方法。

“打印输出”是通过<xsl:value-of ...声明完成的。

+0

一个简单的问题为什么我们要在代码顶部使用''?它不会导致数字总是1? – newday 2013-02-13 06:29:15

+0

我不知道我是否正确答案......你的意思是为什么param不在模板定义之外?如果这是你的问题...... param是一个占位符,可以将值作为模板调用参数。参数也是不变的。 – OkieOth 2013-02-13 15:08:19

在XSLT中,我们使用递归来代替循环。递归只不过是一种特定类型的函数,在需要找到最终解决方案时会多次调用自己。所以,

  1. 输入数变量为“1”
  2. 如果是给定的值小于1,则它简单地打印的$number
  3. 否则值时,它被移动到呼叫模板作为输入对于与-PARAM
  4. 这里,再次调用相同的模板,并传递价值,命名为number
  5. 那么结果值将被赋给变量recursive_result
  6. 同一个变量的帮助下,可变数目

希望会明白。