<xslTutorial creator="nicmila@idoox.com">
<index keywords='xsl:call-template recursion xsl:param xsl:with-param mode'/>

<description><stylesheet id='id2'/> generates a table with selected elements,
with the number of elements per row given in the stylesheet. If the elements should be sorted, the solution is more complex (<stylesheet id='id3'/>). 
</description>

<xmlSource id="id1">
<data>
<item>Fe</item>
<item>Cl</item>
<item>Br</item>
<item>I</item>
<item>Ni</item>
<item>H</item>
<item>Po</item>
<item>S</item>
<item>O</item>
</data>
</xmlSource>

<attValues>
<value match="">
</value>
</attValues>

<xslStylesheet id="id2">


<xsl:template match="/">
<TABLE border='1'>
<xsl:variable name="inRow" select='3'/>
<xsl:apply-templates select="//item[position() mod $inRow = 1]">
<xsl:with-param name='inRow' select='$inRow'/>
</xsl:apply-templates>
</TABLE>

<TABLE border='1'>
<xsl:variable name="inRow" select='4'/>
<xsl:apply-templates select="//item[position() mod $inRow = 1]">
<xsl:with-param name='inRow' select='$inRow'/>
</xsl:apply-templates>
</TABLE>

<TABLE border='1'>
<xsl:variable name="inRow" select='5'/>
<xsl:apply-templates select="//item[position() mod $inRow = 1]">
<xsl:with-param name='inRow' select='$inRow'/>
</xsl:apply-templates>
</TABLE>

</xsl:template>

<xsl:template match="item">
<xsl:param name="inRow"/>
<TR>
<TD><xsl:value-of select="."/></TD>
<xsl:apply-templates select="following::item[position() < $inRow]" mode='cell'/>
</TR>
</xsl:template>

<xsl:template match="item" mode='cell'>
<xsl:param name="inRow"/>

<TD><xsl:value-of select="."/></TD>
</xsl:template>
</xslStylesheet>

<xslStylesheet id="id3">
<xsl:template match="/">
<xsl:call-template name="generateTable">
<xsl:with-param name="inRow" select="3"/>
</xsl:call-template>
<xsl:call-template name="generateTable">
<xsl:with-param name="inRow" select="4"/>
</xsl:call-template>
<xsl:call-template name="generateTable">
<xsl:with-param name="inRow" select="5"/>
</xsl:call-template>
</xsl:template>

<xsl:template name="generateTable">
<xsl:param name="inRow"/>
<xsl:variable name="text">
<xsl:for-each select="//item">
<xsl:sort order="ascending" select="."/>
<xsl:value-of select="."/>
<xsl:choose>
<xsl:when test='position()=last()'>
<xsl:text>XCELLSXXROWSX</xsl:text>
</xsl:when>
<xsl:when test='position() mod $inRow'>
<xsl:text>XCELLSX</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>XCELLSXXROWSX</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:variable>

<TABLE border="1">
<xsl:call-template name="rows">
<xsl:with-param name="string" select="$text"/>
</xsl:call-template>
</TABLE>
</xsl:template>

<xsl:template name="rows">
<xsl:param name="string"/>
<TR>
<xsl:call-template name="cells">
<xsl:with-param name='string'><xsl:value-of select="substring-before($string,'XROWSX')"/>
</xsl:with-param>
</xsl:call-template>
</TR>
<xsl:if test="string-length($string)">
<xsl:call-template name="rows">
<xsl:with-param name='string'><xsl:value-of select="substring-after($string,'XROWSX')"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>

<xsl:template name="cells">
<xsl:param name="string"/>
<TD>
<xsl:value-of select="substring-before($string,'XCELLSX')"/>
</TD>
<xsl:if test="string-length($string)">
<xsl:call-template name="cells">
<xsl:with-param name='string'><xsl:value-of select="substring-after($string,'XCELLSX')"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>

</xslStylesheet>


</xslTutorial>