tory, вот так можно вставить произвольный HTML-код для каждой пятой подгруппы.
<li>
<xsl:attribute name="class">
<xsl:if test="$current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1">active</xsl:if>
<!--<xsl:if test="position() = last()">last</xsl:if>-->
<xsl:if test="$sub">has-sub</xsl:if>
</xsl:attribute>
...
<xsl:if test="$sub and count(ancestor::*) < $max_level or $max_level = 0">
<ul>
<xsl:apply-templates select="$sub" />
</ul>
</xsl:if>
</li>
<xsl:if test="position() mod 5 = 0 and position() != last()">
<xsl:text disable-output-escaping="yes">
</ul>
<ul>
</xsl:text>
</xsl:if>
Закрываем список и открываем новый для каждой пятой группы, если она не последняя(чтобы небыло пустых списков).
Пример приведён как образец. И как конкретная реализация поведёт себя в вашем меню предсказать сложно.