Другой способ сделать это - сопоставить cd в первой, четвертой, седьмой (и т. Д.) Позиции.
<xsl:apply-templates select="cd[(position() - 1) mod $columns = 0]" mode="first"/>
Где $ столбцы параметр, содержащий количество столбцов
. Затем вы можете сопоставить элементы cd в строке, посмотрев соответствующее число следующих братьев и сестер:
<xsl:apply-templates select=".|following-sibling::cd[position() < $columns]"/>
Вотполный XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" omit-xml-declaration="yes" />
<xsl:param name="columns" select="3"/>
<xsl:template match="/catalog">
<html>
<body>
<h2>My CD Collection</h2>
<table>
<xsl:apply-templates select="cd[(position() - 1) mod $columns = 0]" mode="first"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="cd" mode="first">
<tr>
<xsl:apply-templates select=".|following-sibling::cd[position() < $columns]"/>
<xsl:if test="count(following-sibling::cd) < ($columns - 1)">
<xsl:call-template name="emptycell">
<xsl:with-param name="cells" select="$columns - 1 - count(following-sibling::cd)"/>
</xsl:call-template>
</xsl:if>
</tr>
</xsl:template>
<xsl:template match="cd">
<td>
<xsl:value-of select="concat(title, ' ', artist)"/>
</td>
</xsl:template>
<xsl:template name="emptycell">
<xsl:param name="cells"/>
<td/>
<xsl:if test="$cells > 1">
<xsl:call-template name="emptycell">
<xsl:with-param name="cells" select="$cells - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
При применении к вашему образцу XML выводится следующее:
<html>
<body>
<h2>My CD Collection</h2>
<table>
<tr>
<td>Empire Burlesque Bob Dylan</td>
<td>Hide your heart Bonnie Tyler</td>
<td>Greatest Hits Dolly Parton</td>
</tr>
<tr>
<td>One night only Bee Gees</td>
<td>Sylvias Mother Dr.Hook</td>
<td>Maggie May Rod Stewart</td>
</tr>
</table>
</body>
</html>
(я вывожу только name и Artist здесь, но я уверен, что вы можете увидеть, как изменить его, чтобы показать больше информации)
Обратите внимание, что есть немного неприятного рекурсивного шаблона для вывода пустых ячеек, если количество оставшихся cd элементов должно быть меньше количества столбцов в строке.
Например, измените значение параметра на 4, после чего вы получите следующее:
<table>
<tr>
<td>Empire Burlesque Bob Dylan</td>
<td>Hide your heart Bonnie Tyler</td>
<td>Greatest Hits Dolly Parton</td>
<td>One night only Bee Gees</td>
</tr>
<tr>
<td>Sylvias Mother Dr.Hook</td>
<td>Maggie May Rod Stewart</td>
<td />
<td />
</tr>
</table>