XSL - 为什么这会永远递减?

时间:2010-10-23 10:44:07

标签: xml xslt recursion

我正在尝试使用我在网络上看到的递归习惯用来创建类似于for循环的东西。我的实现是一个参数,告诉打印什么。我使用Eclipse内置的XSL转换器,我不能为我的生活看到它给出StackOverflowException的原因:

<!-- 
    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表达式?

提前致谢。

2 个答案:

答案 0 :(得分:3)

  

另外,为什么$ count&lt; $ max给   无效的Xpath表达式?

您应该使用&lt;代替<符号。

答案 1 :(得分:3)

  

我不能为我的生活看到它的原因   给出一个StackOverflowException

代码中的“停止”检查太弱

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

true()如果$max小于$count,则<{1}} $max$count中的一个或两个没有整数值,或者它们是未定义的。

  

另外,为什么$ count&lt; $ max给   无效的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" />