如何在XSLT中执行"while"类循环?

ast*_*o11 2 sql xslt loops while-loop

我是XSLT的新手,我在这个问题上遇到了很多困难:我需要在XSLT中做类似循环的循环.我认为for-each不足以解决这个问题.

我有一个变量,它是SELECT语句的结果.它可以返回0或整数.如果值为0,则需要再次执行SELECT发送另一个参数以查看该值是否不同.

我只能考虑使用类似循环的循环,但也许它有另一种方法来实现这一点?就像使用模板并最终调用自己一样?可能吗?

像这样的东西:

<!-- 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 -->
Run Code Online (Sandbox Code Playgroud)

Emi*_*ggi 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>
Run Code Online (Sandbox Code Playgroud)

  • 容易出现堆栈溢出. (2认同)

Mic*_*Kay 5

就像使用模板并最终调用自己一样?

正确:尾递归是解决这个问题的常用方法,如 empo 所示。更好的 XSLT 处理器将优化尾递归,因此它不会占用堆栈。更糟糕的将在 500 次左右迭代后耗尽堆栈空间,在这种情况下,您需要寻找不同的解决方案。

注意:尽量避免这种构造

<xsl:variable name="date">
    <xsl:value-of select="$date - 1" /> 
</xsl:variable>
Run Code Online (Sandbox Code Playgroud)

你什么时候可以做

<xsl:variable name="date" select="$date - 1" /> 
Run Code Online (Sandbox Code Playgroud)

它不必要地冗长,而且效率也非常低,因为变量值是一棵树而不是简单的字符串或数字。