2010-09-14 12 views
5

Todos,recursiva Loop XSLT

que tiene el siguiente 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 forma de llamarlo es:

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

En el momento que muestra los números de 100 a 0 y en el espacio entre ellos. (100 99 98 97 .....)

¿Cómo puedo cambiarlo para que haga lo opuesto? (1 2 3 4 ....)

Muchas gracias,

M

+0

Buena pregunta (+1). Vea mi respuesta para una solución corta y más eficiente que la actualmente seleccionada. :) –

Respuesta

6

basta con cambiar el orden dentro de la plantilla:

<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

Solución buena pero no demasiado confiable y eficiente. –

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> 

cuando se realiza esta transformación en cualquier documento XML (no utilizado), el resultado deseado: 1 a 100 se produce.

hacer la nota: Esta solución es será optimizado recursiva de cola y con muchos procesadores XSLT por lo que se elimina la recursividad. Esto significa que puede usarlo con $count establecido en millones sin desbordamiento de pila o ejecución lenta.

Una solución recursiva no la cola, como el de @ 0xA3 se estrella con la pila de desbordamiento de (con Saxon 6.5.4) incluso con count = 1000

0

prueba este.

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