2013-02-11 69 views
0

我想了解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">包裝析因模板。

如果有更清晰的例子可用,請指導我。我缺乏遞歸知識。

回答

1

call-template元素包裝有variable元素,以便將調用它的結果分配給變量recursive_result

這樣做的目的是爲了能夠在下一行乘以number以產生最終結果。

1

您不能在XSLT中聲明可從腳本的其他部分更改的全局變量。如果您需要模板調用的結果或遞歸是將生成的結果「打印出」到變量中的唯一方法。

「打印輸出」是通過<xsl:value-of ...聲明完成的。

+0

一個簡單的問題爲什麼我們要在代碼頂部使用''?它不會導致數字總是1? – newday 2013-02-13 06:29:15

+0

我不知道我是否正確答案......你的意思是爲什麼param不在模板定義之外?如果這是你的問題...... param是一個佔位符,可以將值作爲模板調用參數。參數也是不變的。 – OkieOth 2013-02-13 15:08:19

0

在XSLT中,我們使用遞歸來代替循環。遞歸只不過是一種特定類型的函數,在需要找到最終解決方案時會多次調用自己。所以,

  1. 輸入數變量爲「1」
  2. 如果是給定的值小於1,則它簡單地打印的$number
  3. 否則值時,它被移動到呼叫模板作爲輸入對於與-PARAM
  4. 這裏,再次調用相同的模板,並傳遞價值,命名爲number
  5. 那麼結果值將被賦給變量recursive_result
  6. 同一個變量的幫助下,可變數目

希望會明白。