私の入力XMLドキュメントは、アイテムの単純なリストです。アイテムの数は任意です。
<items>
<item name="item1"/>
<item name="item2"/>
<item name="item3"/>
...
<item name="itemX"/>
</items>
ここで、このリストをHTMLテーブルに分割したいと思います。行と列の数は、パラメーター値として指定されます。
<xsl:param name="rows"/>
<xsl:param name="cols"/>
行を3、列を2とすると、結果のHTMLは次のようになります。
<table>
<tr>
<td>item1</td>
<td>item2</td>
</tr>
<tr>
<td>item3</td>
<td>item4</td>
</tr>
<tr>
<td>item5</td>
<td>item6</td>
</tr>
</table>
<table>
<tr>
<td>item7</td>
<td>item8</td>
</tr>
<tr>
<td>item9</td>
<td>item10</td>
</tr>
<tr>
<td>item11</td>
<td>item12</td>
</tr>
</table>
...
<table>
したがって、作成されるの数は次のようになります。ceil(number_of_items / rows / cols)
私はこれを解決するための基本的な考えを持っていますが、最後の微調整を正しく行うことができないようです。次のスタイルシートは、私が望むものに近いものを生成しますが、項目4、7、10、および13が重複しています。誰かがこれを行う方法についてより良いアイデアを持っていますか?
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="cols" select="2"/>
<xsl:param name="rows" select="3"/>
<xsl:template match="/*">
<html>
<head/>
<body>
<xsl:apply-templates select="*[position() mod ($cols * $rows) = 1]" mode="table"/>
</body>
</html>
</xsl:template>
<xsl:template match="*" mode="table">
<table border="1" id="{@name}">
<xsl:apply-templates select="." mode="row"/>
<xsl:apply-templates select="following-sibling::*[position() > 1 and position() mod $rows = 0]" mode="row"/>
</table>
</xsl:template>
<xsl:template match="*" mode="row">
<tr id="{@name}">
<xsl:apply-templates select="." mode="cell"/>
<xsl:apply-templates select="following-sibling::*[position() < $cols]" mode="cell"/>
</tr>
</xsl:template>
<xsl:template match="*" mode="cell">
<td>
<xsl:apply-templates select="."/>
</td>
</xsl:template>
<xsl:template match="item">
<xsl:value-of select="@name"/>
</xsl:template>
</xsl:stylesheet>