Рекурсивная петля XSLT - PullRequest
       15

Рекурсивная петля XSLT

5 голосов
/ 14 сентября 2010

Все,

У меня есть ниже XSLT

<xsl:template name="loop">
    <xsl:param name="count" select="1"/>
    <xsl:if test="$count > 0">
        <xsl:text> </xsl:text>
        <xsl:value-of select="$count"/>  
        <xsl:call-template name="loop">
            <xsl:with-param name="count" select="$count - 1"/>
        </xsl:call-template>
    </xsl:if>    
</xsl:template>

Способ его вызова:

<xsl:call-template name="loop
    <xsl:with-param name="count" select="100"/>
</xsl:call-template>

На данный момент отображаются цифры от 100 до0 и пробел между ними.(100 99 98 97 .....)

Как я могу изменить это на противоположное?(1 2 3 4 ....)

Большое спасибо,

M

Ответы [ 3 ]

9 голосов
/ 14 сентября 2010

Используйте :

<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>

, когда это преобразование выполняется для любого XML-документа (не используется), желаемый результат: создается от 1 до 100 .

Обратите внимание : Это решение с хвостовой рекурсией и со многими процессорами XSLT будет оптимизировано, чтобы исключить рекурсию.Это означает, что вы можете использовать его с $count, установленным на миллионы, без переполнения стека или медленного выполнения.

Не хвостовое рекурсивное решение, такое как @0xA3, сбои с переполнением стека (с саксонской 6.5.4) даже с count = 1000

6 голосов
/ 14 сентября 2010

Просто измените порядок внутри шаблона:

<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 голосов
/ 12 июня 2014

Попробуйте это.

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...