Supposons que vous ayez une tâche hautement synthétique pour imprimer des nombres de 1 à 1.000.000 sans XML d'entrée approprié. Bien sûr, la récursivité directe échouera en raison d'un débordement de pile, assez ironique.Imprime les nombres de un à un million
je suis venu avec la solution ci-dessous:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="end" select="number(1000000)"/>
<xsl:template match="/">
<xsl:call-template name="batches"/>
</xsl:template>
<xsl:template name="batches">
<xsl:param name="start" select="number(1)"/>
<xsl:param name="stop" select="$end"/>
<xsl:param name="ololo"/>
<xsl:if test="$start <= ($end)">
<xsl:choose>
<xsl:when test="$stop = 0">
<xsl:value-of select="$start"/>:<xsl:value-of select="$ololo"/>
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="batches">
<xsl:with-param name="start" select="$start"/>
<xsl:with-param name="stop" select="floor($stop div 2)"/>
<xsl:with-param name="ololo" select=" 'A' "/>
</xsl:call-template>
<xsl:call-template name="batches">
<xsl:with-param name="start" select="floor($stop div 2) + $start + 1"/>
<xsl:with-param name="stop" select="floor($stop div 2)"/>
<xsl:with-param name="ololo" select=" 'B' "/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Il fonctionne aussi bien dans libxslt et MSXML. Mais il imprime des numéros en double et semble assez gênant en termes d'efficacité. Cela peut-il être amélioré d'une manière ou d'une autre?
Pourquoi appelez-vous modèle "Lots" deux fois? – TarasB
C'est une tentative terne (?) Pour implémenter le modèle de division et de conquête. – Flack
Bonne question, +1. Voir ma réponse pour une analyse exhaustive et des solutions complètes. –