Вам не нужно делать что-то необычное, например, рекурсию. И, Господи, даже не задумывайтесь над использованием CDATA.
Вы просто должны думать как XSLT и спрашивать: «Какой элемент ввода я хочу преобразовать в мой элемент вывода?»
Предполагая, что каждый ul
должен содержать N item
с, вы хотите преобразовать каждый N-й вход item
, начиная с первого, в ul
:
<xsl:variable name="n" select="number(4)"/>
<xsl:template match="/">
<output>
<xsl:apply-templates select="/root/item[position() mod $n = 1]"/>
</output>
</xsl:template>
Каждый из этих item
элементов становится ul
, который содержит элемент и каждый из его N-1 следующих братьев и сестер:
<xsl:template match="item">
<ul>
<xsl:for-each select=". | following-sibling::item[position() < $n]">
<li>
<xsl:value-of select="."/>
</li>
</xsl:for-each>
</ul>
</xsl:template>
Предполагая, что входной документ выглядит так:
<root>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
</root>
... вы получите этот вывод, если для $n
установлено значение 4:
<output>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<ul>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
</ul>
<ul>
<li>9</li>
</ul>
</output>