2010-09-14 11 views
5

All,ricorsivo Loop XSLT

ho l'XSLT sotto

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

Il modo per chiamare è:

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

Al momento visualizza i numeri da 100 a 0 e lo spazio fra loro. (100 99 98 97 .....)

Come posso cambiare a fare il contrario? (1 2 3 4 ....)

Molte grazie,

M

+0

Buona domanda (+1). Vedi la mia risposta per una soluzione breve e più efficiente di quella attualmente selezionata. :) –

risposta

6

semplicemente cambiare l'ordine all'interno del 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

Soluzione buona ma non troppo affidabile ed efficiente. –

9

Uso:

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

quando viene eseguita questa trasformazione su qualsiasi documento XML (non utilizzato), il risultato desiderato: da 1 a 100 viene prodotto.

nota impegno: Questa soluzione è ricorsiva in coda e con molti processori XSLT viene ottimizzato in modo che ricorsione viene eliminato. Ciò significa che puoi usarlo con $count impostato su milioni senza overflow dello stack o esecuzione lenta.

Una soluzione ricorsiva non-coda, come quello di @ 0xA3 crash con la pila di overflow (con Saxon 6.5.4) anche con count = 1000

0

provare questo.

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