Хотя проблема неверно определена, если число узлов меньше количества деталей, здесь приведено преобразование, которое я думаю производит на выходе, который ОП, скорее всего, хочет (Почему он просто не указал это поведение ???):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/t">
<t>
<xsl:variable name="vNodes" select="mode"/>
<xsl:variable name="vNumParts" select="4"/>
<xsl:variable name="vNumCols" select="ceiling(count($vNodes) div $vNumParts)"/>
<xsl:variable name="vrealNum">
<xsl:choose>
<xsl:when test="$vNumCols >1">
<xsl:value-of select="$vNumCols"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="count($vNodes)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:for-each select="$vNodes[position() mod $vrealNum = 1]">
<xsl:variable name="vCurPos" select="(position()-1)*$vrealNum +1"/>
<ul>
<xsl:for-each select="$vNodes[position() >= $vCurPos and not(position() > $vCurPos + $vrealNum -1)]">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:for-each>
</t>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к следующему XML-документу (он даже не может предоставить правильно сформированныйXML-документ!):
<t>
<mode>1</mode>
<mode>2</mode>
</t>
вывод - это то, что я догадываюсь ОП хотел ...
<t>
<ul>
<li>1</li>
<li>2</li>
</ul>
</t>