2010-10-23 126 views
2

我試圖用我在網上看到的遞歸習慣用法來創建類似於for-loop的東西。我的實現是用一個參數來告訴打印什麼。我使用Eclipse的內置XSL transformator,我不能爲我的生活爲什麼它給出了一個StackOverflowException:XSL - 爲什麼這個遞歸永遠?

<!-- 
    Loops recursively to print something the number of times specified with 
    the max parameter. 
    The print parameter tells what to print. 
--> 
<xsl:template name="loop"> 
    <xsl:param name="count" select="1"/> 
    <xsl:param name="max" /> 
    <xsl:param name="print" /> 
    <xsl:if test="not($count = $max)"> 

     <xsl:value-of select="$print" /> 

     <xsl:call-template name="loop"> 
      <xsl:with-param name="count"> 
       <xsl:value-of select="$count + 1" /> 
      </xsl:with-param> 
      <xsl:with-param name="max"> 
       <xsl:value-of select="$max"/> 
      </xsl:with-param> 
      <xsl:with-param name="print"> 
       <xsl:value-of select="$print" /> 
      </xsl:with-param> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

而且,爲什麼$count < $max放棄無效的XPath表達式?

在此先感謝。

+0

問得好,+1。請參閱我的回答以獲得詳細的解釋並回答您的兩個問題。 :) – 2010-10-23 16:29:55

回答

3

我不能爲我的生活爲什麼它 給出了一個StackOverflowException

爲 「停止」 的代碼是太弱的檢查

<xsl:if test="not($count = $max)">  

這將永遠是true()如果$max小於$count,如果其中一個或兩個$max$count不具有整數值,或者它們未定義。

而且,爲什麼$數< $最大給 無效的XPath表達式?

您可以使用

not($count >= $max) 

,從而避免需要躲避<字符。

最後,另外一個問題,沒有直接關係的主要問題:

從未在<xsl:with-param><xsl:param><xsl:variable>身體指定參數(原子)值。這會創建一個RTF(結果樹片段),並且每次引用參數/變量時都需要轉換爲適當的原子值。這是效率低下,難以閱讀和維護,並可能導致錯誤。

而不是

 <xsl:with-param name="count">    
      <xsl:value-of select="$count + 1" />    
     </xsl:with-param>    

 <xsl:with-param name="count" select="$count + 1" />    
+0

感謝您的詳細解釋。 – 2010-10-23 19:07:29

3

此外,爲什麼$ count < $ max給 無效的Xpath表達式?

您應該使用&lt;而不是<符號。

+0

謝謝。它起作用,如果我使用這個條件,並從0開始,所以我假設無限遞歸與我以前的條件有關。 – 2010-10-23 11:00:25