Причина ошибки очевидна: любая таблица стилей XSLT должна быть правильно сформированным документом XML , а эта предоставленная таблица стилей - нет.Вот почему даже синтаксический анализатор XML, используемый процессором XSLT для получения модуля таблицы стилей, вызывает исключение неправильной формы.
В частности, этот фрагмент:
<xsl:if test="position() mod 3 = 0">
</ul>
</li>
<li>
<ul class="separator">
</xsl:if>
не являетсяправильно сформированный фрагмент XML, поскольку для конечных тегов </ul>
и </li>
и *1009*.
нет начального тега. И, наконец, правильный пример такой позиционной группировки :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="num[position() mod 3 = 1]">
<group>
<xsl:copy-of select=
". | following-sibling::*[not(position() > 2)]"/>
</group>
</xsl:template>
<xsl:template match="num"/>
</xsl:stylesheet>
когда это преобразование применяется к следующему документу XML :
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
желаемый, правильно сгруппированный результат получается :
<nums>
<group>
<num>01</num>
<num>02</num>
<num>03</num>
</group>
<group>
<num>04</num>
<num>05</num>
<num>06</num>
</group>
<group>
<num>07</num>
<num>08</num>
<num>09</num>
</group>
<group>
<num>10</num>
</group>
</nums>