我正在尝试使用我在网络上看到的递归习惯用来创建类似于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表达式?
提前致谢。
答案 0 :(得分:3)
另外,为什么$ count&lt; $ max给 无效的Xpath表达式?
您应该使用<
代替<
符号。
答案 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" />