Source de syracuse.xsl
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0">
<xsl:output method="xml" encoding="utf-8" />
<!-- Lecture du document XML -->
<xsl:template match="//syracuse">
<syracuse>
</xsl:template><xsl:choose>
</syracuse>
<!-- Cas pour un seul vol -->
<xsl:when test="@value">
<xsl:call-template name="syracuse">
</xsl:when><xsl:with-param name="value" select="@value" />
</xsl:call-template>
<!-- Cas pour plusieurs vol dans un intervalle -->
<xsl:when test="@minvalue and @maxvalue">
</xsl:choose><xsl:call-template name="boucle">
</xsl:when><xsl:with-param name="current" select="@minvalue" />
<xsl:with-param name="max" select="@maxvalue" />
</xsl:call-template>
<!-- Boucler sur plusieurs vols -->
<xsl:template name="boucle">
<xsl:param name="current" />
<xsl:param name="max" />
<xsl:if test="$current <= $max">
</xsl:template><loop num="{$current}">
<xsl:call-template name="syracuse">
</loop><xsl:with-param name="value" select="$current" />
</xsl:call-template><xsl:call-template name="boucle">
</xsl:if><xsl:with-param name="current" select="$current + 1" />
<xsl:with-param name="max" select="$max" />
</xsl:call-template>
<!-- Un vol -->
<xsl:template name="syracuse">
</xsl:stylesheet><xsl:param name="value" />
<step value="{$value}" />
<xsl:if test="$value > 1">
</xsl:template><xsl:choose>
</xsl:if><xsl:when test="($value mod 2) = 0">
<xsl:call-template name="syracuse">
</xsl:when><xsl:with-param name="value" select="$value div 2" />
</xsl:call-template><xsl:otherwise>
</xsl:choose><xsl:call-template name="syracuse">
</xsl:otherwise><xsl:with-param name="value" select="(3 * $value) + 1" />
</xsl:call-template>