О, я такое делал. :) По коду криво получилось, я тогда только-только hello world освоил.
Берём кратный 3-м элемент. забираем элементы с position равным position()-2 и position-1.
Нужно предусмотреть варианты, если у вас меньше 3-х элементов и если к примеру 5. т.е. кратное 3-м - 3, а 4 и 5 остаются не тронутыми.
Потом я решил что проще брать каждый 3-ий элементы и следующие за ним два, а первые элементы предварительно обработать.
Обработал варианты если всего 1,2,3 элемента. Если 3 и более, то за счёт following-sibling нормально работает
Сейчас я уже понял, что это нужно делать в макросе и заране готовить xml для парсинга. Но тогда я не умел этого делать и решил каким-то диким способом.
Мне нужно было выводить в таблицу модификаций авто... И решил как-то так:
Первые элементы обрабатываю вручную.
Остальные в цикле беру используя following-sibling
<!-- обработка первых элементов -->
<table class="table_news">
<thead>
<tr><td class="first">Модель</td>
<xsl:choose>
<xsl:when test="count(page)=1">
<xsl:apply-templates select="page[position() = 1]" mode="modify_head_last"/>
</xsl:when>
<xsl:when test="count(page)=2">
<xsl:apply-templates select="page[position() = 1]" mode="modify_head_first"/>
<xsl:apply-templates select="page[position() = 2]" mode="modify_head_last"/>
</xsl:when>
<xsl:when test="count(page)=3">
<xsl:apply-templates select="page[position() = 1]" mode="modify_head_first"/>
<xsl:apply-templates select="page[position() = 2]" mode="modify_head_first"/>
<xsl:apply-templates select="page[position() = 3]" mode="modify_head_last"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="page[position() = 1]" mode="modify_head_first"/>
<xsl:apply-templates select="page[position() = 2]" mode="modify_head_first"/>
<xsl:apply-templates select="page[position() = 3]" mode="modify_head_last"/>
</xsl:otherwise>
</xsl:choose>
</tr>
</thead>
<tbody>
..... тут выводим первые элементы .....
</tbody>
</table>
<!-- / обработка первых элементов -->
<!-- обработка следующих элементов -->
<xsl:variable name="itemcount" select="count(page)"/>
<xsl:for-each select="page[position() mod 3 = 0]">
<xsl:variable name="colsibling" select="count(following-sibling::page[position() <= 3])"/>
<xsl:if test="count(following-sibling::page[position() <= 3]) > 0">
<table class="table_news">
<thead>
<tr><td class="first">Модель</td>
<xsl:apply-templates select="following-sibling::page[position() <= 3]" mode="modify_head"/>
</tr>
</thead>
<tbody>
...... выводим элементы ........
</tbody>
</table>
</xsl:if>
</xsl:for-each>
<!-- / обработка следующих элементов -->
еще одна вариация последнего решения.
<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" />
<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList' and //item]">
<div class="objectList">
<xsl:apply-templates select="//item[position() mod 3 =1]" mode="col"/>
<xsl:apply-templates select="//item[position() mod 3 =2]" mode="col"/>
<xsl:apply-templates select="//item[position() mod 3 =0]" mode="col"/>
</div>
<xsl:apply-templates select="total" />
</xsl:template>
<xsl:template match="//item" mode="col">
<ul class="col_one">
<xsl:apply-templates select="." mode="col_item"/>
</ul>
</xsl:template>
<xsl:template match="//item" mode="col_item">
<li>
<a href="{@link}" class="linkItem">
<xsl:value-of select="." />
</a>
...
</li>
</xsl:template>
P.S. Решение писалось по памяти, так что возможны неточности
возможно я немного не верно написал, попробуйте так
<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" />
<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList' and //item]">
<div class="objectList">
<ul class="col_one">
<xsl:apply-templates select="//item[position() mod 3 =1]" mode="col_item"/>
</ul>
<ul class="col_one">
<xsl:apply-templates select="//item[position() mod 3 =2]" mode="col_item"/>
</ul>
<ul class="col_one">
<xsl:apply-templates select="//item[position() mod 3 =0]" mode="col_item"/>
</ul>
</div>
<xsl:apply-templates select="total" />
</xsl:template>
<xsl:template match="//item" mode="col_item">
<li>
<a href="{@link}" class="linkItem">
<xsl:value-of select="." />
</a>
...
</li>
</xsl:template>