Recursive Loop XSLT

后端 未结 3 1509
不思量自难忘°
不思量自难忘° 2021-01-05 10:50

All,

I have the below XSLT


    
              


        
相关标签:
3条回答
  • 2021-01-05 11:29

    Use:

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
    
        <xsl:template match="/">
          <xsl:call-template name="loop">
            <xsl:with-param name="count" select="100"/>
          </xsl:call-template>
        </xsl:template>
    
        <xsl:template name="loop">
            <xsl:param name="count" select="1"/>
            <xsl:param name="limit" select="$count+1"/>
    
            <xsl:if test="$count > 0">
                <xsl:text> </xsl:text>
                <xsl:value-of select="$limit - $count"/>
                <xsl:call-template name="loop">
                    <xsl:with-param name="count" select="$count - 1"/>
                    <xsl:with-param name="limit" select="$limit"/>
                </xsl:call-template>
            </xsl:if>
        </xsl:template>
    </xsl:stylesheet>
    

    when this transformation is performed on any XML document (not used), the wanted result: 1 to 100 is produced.

    Do note: This solution is tail-recursive and with many XSLT processors will be optimized so that recursion is eliminated. This means you can use it with $count set to millions without stack overflow or slow execution.

    A non-tail recursive solution, like the one of @0xA3 crashes with stack-overflow (with Saxon 6.5.4) even with count = 1000

    0 讨论(0)
  • 2021-01-05 11:38

    Simply change the order inside the template:

    <xsl:template name="loop">
        <xsl:param name="count" select="1"/>
    
        <xsl:if test="$count > 0">
            <xsl:call-template name="loop">
                <xsl:with-param name="count" select="$count - 1"/>
            </xsl:call-template>
    
            <xsl:value-of select="$count"/>  
            <xsl:text> </xsl:text>
    
        </xsl:if>    
    </xsl:template>
    
    0 讨论(0)
  • 2021-01-05 11:44

    Try this one.

    <xsl:template name="loop">
        <xsl:param name="inc"/>
        <xsl:param name="str" select="1"/>
        <xsl:if test="$str &lt;= $inc">
            <xsl:text> </xsl:text>
            <xsl:value-of select="$str"/>
            <xsl:call-template name="loop">
                <xsl:with-param name="inc" select="$inc"/>
                <xsl:with-param name="str" select="$str + 1"></xsl:with-param>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    
    <xsl:call-template name="loop">
         <xsl:with-param name="inc" select="10"/>
    </xsl:call-template>
    
    0 讨论(0)
提交回复
热议问题