グループ化する行数のパラメーターがあると仮定すると、最初、4 番目、7 番目などの位置にある現在のグループ要素を持つitem要素を選択することから始めます。
<xsl:apply-templates select="item[position() mod $rows = 1]" mode="group"/>
( item要素に一致する 2 つのテンプレートがあるため、モードの使用に注意してください)
次に、これに一致したテンプレート内で、次のようにグループ内のすべてのアイテムを選択します
<xsl:apply-templates select="self::*|following-sibling::item[position() < $rows]"/>
ここに完全な XSLT があります
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="rows" select="3"/>
<xsl:template match="group">
<div class="group">
<h2><xsl:value-of select="@name"/></h2>
<xsl:apply-templates select="item[position() mod $rows = 1]" mode="group"/>
</div>
</xsl:template>
<xsl:template match="item" mode="group">
<div class="row">
<xsl:apply-templates select="self::*|following-sibling::item[position() < $rows]"/>
</div>
</xsl:template>
<xsl:template match="item">
<div class="four columns">
<div class="item"><xsl:value-of select="@name"/></div>
</div>
</xsl:template>
</xsl:stylesheet>
次の XML に適用した場合
<groups>
<group name="Group 1">
<item name="Item 1"/>
<item name="Item 2"/>
<item name="Item 3"/>
<item name="Item 4"/>
</group>
<group name="Group 2">
<item name="Item 1"/>
<item name="Item 2"/>
<item name="Item 3"/>
<item name="Item 4"/>
</group>
</groups>
以下が出力されます
<a>
<div class="group">
<h2>Group 1</h2>
<div class="row">
<div class="four columns">
<div class="item">Item 1</div>
</div>
<div class="four columns">
<div class="item">Item 2</div>
</div>
<div class="four columns">
<div class="item">Item 3</div>
</div>
</div>
<div class="row">
<div class="four columns">
<div class="item">Item 4</div>
</div>
</div>
</div>
<div class="group">
<h2>Group 2</h2>
<div class="row">
<div class="four columns">
<div class="item">Item 1</div>
</div>
<div class="four columns">
<div class="item">Item 2</div>
</div>
<div class="four columns">
<div class="item">Item 3</div>
</div>
</div>
<div class="row">
<div class="four columns">
<div class="item">Item 4</div>
</div>
</div>
</div>
</a>
編集:あなたのコメントに答えて、列の正確な数がない場合に最後の列のクラス名を変更したい場合は、xsl:chooseを使用してこれを行うことができ、それが最後の項目であるかどうかを確認します。位置が必要な数と一致しませんでした。
<xsl:template match="item">
<div>
<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="not(following-sibling::item) and position() mod $rows != 0">end</xsl:when>
<xsl:otherwise>four columns</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<div class="item">
<xsl:value-of select="@name"/>
</div>
</div>
</xsl:template>