Гораздо более простое решение :
<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="item[position() mod 3 = 1]">
<div>
<xsl:copy-of select=
".|following-sibling::*[not(position() > 2)]"/>
</div>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<shop>
<item></item>
<item></item>
<item></item>
<item></item>
<item></item>
<item></item>
<item></item>
</shop>
производиттребуемый, правильный результат :
<div>
<item/>
<item/>
<item/>
</div>
<div>
<item/>
<item/>
<item/>
</div>
<div>
<item/>
</div>
Обновление :
ОП пояснил, что ему нужно преобразование, которое обработало бы документ XML на эта страница .Все должно быть скопировано как есть, за исключением любой группы <item>
элементов, которые должны быть сгруппированы по три, и каждая группа должна быть заключена в <div>
.
Вот код для этого:
<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="node()[self::item and position() mod 3 = 1]">
<div>
<xsl:copy-of select=
".|following-sibling::*[not(position()>2)]"/>
</div>
</xsl:template>
<xsl:template match=
"node()[self::item and not(position() mod 3 = 1)]"/>
</xsl:stylesheet>