xslt中的递归调用

时间:2012-06-19 14:08:14

标签: xml xslt-1.0

我读到使用Divide and Conquer方法使用递归是有效的。任何人都可以建议我如何改善下面的递归调用。它只是重复元素“a”,输出80次。然而它没有任何算法只重复八十次。它如何改善性能(任何链接或指针?)

<xsl:variable name="maxcount" select="'80'" />
<xsl:variable name="count" select="'1'" />
<xsl:if test="$count &gt; 0">
  <xsl:call-template name="copyrec">
    <xsl:with-param name="index" select="'1'" />
  </xsl:call-template>
</xsl:if>
<xsl:template name="copyrec">
  <xsl:param name="index" />
  <xsl:if test="$index &lt;= $maxcount">
    <xsl:variable name="tmpind" select="$index"/>
    <a>this element repeats 80 times</a>
    <xsl:call-template name="copyrec">
      <xsl:with-param name="index" select="$tmpind + 1" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>

1 个答案:

答案 0 :(得分:2)

划分和征服会减少此代码使用的堆栈空间量,但不会更快。对于80次重复,几乎可以肯定有足够的堆栈空间,所以你也可以使用它。对于10000次重复,如果处理器实现尾调用优化,则代码仍然可以正常运行。但是如果你想确保不使用堆栈空间,即使进行10000次迭代,并且处理器没有进行这种基本优化,那么对于这种情况,D + C也非常简单:

<xsl:template name="copyrec">
  <xsl:param name="count" />
  <xsl:choose>
    <xsl:when test="$count = 0"/> <!-- do nothing -->
    <xsl:when test="$count = 1">
      <a>this element repeats 80 times</a>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="copyrec">
        <xsl:with-param name="count" select="floor($count div 2)" />
      </xsl:call-template>
      <xsl:call-template name="copyrec">
        <xsl:with-param name="count" select="$count - floor($count div 2)" />
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>