【发布时间】:2015-01-26 08:29:05
【问题描述】:
我正在将索引字符串转换为索引标记。该字符串可能包含多个级别,以冒号分隔。每个部分还可能有一些其他特殊符号需要稍后处理。
我的测试字符串是“Home:Change”,应该转换成:
<indexterm>Home<indexterm>Change</indexterm></indexterm>
我创建了一个没有递归的模板(只做一个嵌套级别)并且工作正常(注意最外层是在调用此模板之前添加的):
<xsl:template name="parseindexstring">
<xsl:param name="string"/>
<xsl:choose>
<xsl:when test="contains(.,':')">
<xsl:value-of select="substring-before(.,':')"/>
<indexterm>
<xsl:value-of select="substring-after(.,':')"/>
</indexterm>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
但由于我不想将处理限制在一个级别,我决定改用递归:
<xsl:template name="parseindexstring">
<xsl:param name="string"/>
<xsl:choose>
<xsl:when test="contains(.,':')">
<xsl:value-of select="substring-before(.,':')"/>
<indexterm>
<xsl:call-template name="parseindexstring">
<xsl:with-param name="string" select="substring-after(.,':')"/>
</xsl:call-template>
</indexterm>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
这会陷入无限循环,即使在只有两个级别(即只有一个冒号)的索引字符串上也是如此,我不知道为什么。我将字符串的第二部分传递给嵌套调用模板,但它似乎总是采用顶级调用的字符串参数。至少如果我在调试器中单步执行 XSL,它看起来就是这样。我在这里忘记或误解了什么?
【问题讨论】:
标签: xslt recursion parameter-passing infinite-loop