我是XSLT的新手,我在这个问题上遇到了很多困难:我需要在XSLT中做类似循环的循环。我认为for-each不足以解决这个问题。
我有一个变量,它是SELECT语句的结果。它可以返回0或整数。如果值为0,则需要再次发送SELECT以发送另一个参数以查看值是否不同。
我只能考虑使用类似while的循环,但也许它有另一种实现方法?就像使用模板并最终调用自己一样?有可能吗?
类似的东西:
<!-- initiate TEMPLATE -->
<!-- WHILE $VALUE = 0 -->
<xsl:variable name="sql.query">
<sql:param name="SQL_QUERY">SELECT $value FROM date_table WHERE date='$date'</mx:param>
</xsl:variable>
<xsl:variable name="VALUE">
<xsl:value-of select="sql:exec-formula('generic.sql', exsl:node-set($sql.query)//sql:param)" /> <!-- this will bring the result of the SELECT in the variable -->
</xsl:variable>
<xsl:variable name="date">
<xsl:value-of select="$date-1" /> <!-- something like that, it doesn't matter -->
</xsl:variable>
<xsl:if test="$VALUE ='0'">
<!-- call template again -->
</xsl:if>
<!-- end of template -->
答案 0 :(得分:15)
<!-- recursive named template -->
<xsl:template name="while">
<xsl:variable name="VALUE">
<!-- your evaluation -->
</xsl:variable>
<!-- evaluate and recurse -->
<xsl:if test="$VALUE=0">
<xsl:call-template name="while"/>
</xsl:if>
</xsl:template>
答案 1 :(得分:4)
喜欢使用模板并最终调用自己吗?
正确:尾递归是这个问题的常用解决方案,如empo所示。更好的XSLT处理器将优化尾递归,因此它不会占用堆栈。在500次左右的迭代之后,更糟糕的会耗尽堆栈空间,在这种情况下,您需要寻找不同的解决方案。
注意:尽量避免使用这种构造
<xsl:variable name="date">
<xsl:value-of select="$date - 1" />
</xsl:variable>
何时可以
<xsl:variable name="date" select="$date - 1" />
它不必要地冗长,而且效率也非常低,因为变量值是树而不是简单的字符串或数字。