2010-09-14 4 views
5

Tous,récursive boucle XSLT

J'ai le dessous 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> 

La façon de l'appeler est:

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

Au moment où il affiche les numéros de 100 à 0 et dans l'espace entre eux. (100 99 98 97 .....)

Comment puis-je le changer pour faire le contraire? (1 2 3 4 ....)

Merci beaucoup,

M

+0

Bonne question (+1). Voir ma réponse pour une solution courte et plus efficace que celle actuellement sélectionnée. :) –

Répondre

6

Il suffit de changer l'ordre à l'intérieur du modèle:

<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

Bonne solution mais pas trop fiable et efficace. –

9

Utilisation:

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

lorsque cette transformation est effectuée sur tout document XML (non utilisé), le résultat souhaité: 1 à 100 est produit.

Prenez note: Cette solution est récursive et avec de nombreux processeurs XSLT sera optimisé de sorte que récursion est éliminé. Cela signifie que vous pouvez l'utiliser avec $count réglé sur des millions sans débordement de pile ou exécution lente.

Une solution récursif non-queue, comme celui de @ 0xA3 se bloque avec pile débordement (avec Saxon 6.5.4), même avec count = 1000

0

essayer celui-ci.

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