интересный вопрос.Ниже я изложил одно решение, которое использует <xsl:key>
для идентификации каждой группы из трех, используя небольшую модульную арифметику.
Входной документ:
<TestDocument>
<Element>Alpha</Element>
<Element>Bravo</Element>
<Element>Charlie</Element>
<Element>Delta</Element>
<Element>Echo</Element>
<Element>Foxtrot</Element>
<Element>Golf</Element>
<Element>Hotel</Element>
</TestDocument>
Таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<!-- Declare a key to identify each group of 3 elements -->
<xsl:key name="positionKey" match="/TestDocument/Element" use="floor((position() - 2) div 3)"/>
<xsl:template match="/TestDocument">
<html>
<!-- Iterate over the first element in each group -->
<xsl:for-each select="Element[(position() - 1) mod 3 = 0]">
<ul>
<!-- Grab all elements from this group -->
<xsl:apply-templates select="key('positionKey', position()-1)"/>
</ul>
</xsl:for-each>
</html>
</xsl:template>
<xsl:template match="Element">
<li><xsl:value-of select="."/></li>
</xsl:template>
</xsl:stylesheet>
Результаты:
<html>
<ul>
<li>Alpha</li>
<li>Bravo</li>
<li>Charlie</li>
</ul>
<ul>
<li>Delta</li>
<li>Echo</li>
<li>Foxtrot</li>
</ul>
<ul>
<li>Golf</li>
<li>Hotel</li>
</ul>
</html>