グループの最初の要素として要素を使用して要素を「アイテム」に「グループ化」する場合、1つの方法は、 xsl:keyを使用して、要素の最初に先行する要素で要素をグループ化することです。
<xsl:key name="items" match="root/*" use="generate-id(preceding-sibling::a[1])" />
次に、要素を単純に照合し、キーで検索されたすべての要素をコピーできます
<xsl:copy-of select="key('items', generate-id())" />
これが完全なXSLTです
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="items" match="root/*" use="generate-id(preceding-sibling::a[1])" />
<xsl:template match="/root">
<root>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="a" />
</root>
</xsl:template>
<xsl:template match="a">
<item>
<xsl:copy-of select="." />
<xsl:copy-of select="key('items', generate-id())" />
</item>
</xsl:template>
</xsl:stylesheet>
サンプルXMLに適用すると、次のように出力されます。
<root>
<item>
<a>a1</a>
<b>b1</b>
<c>c1</c>
<a>a2</a>
</item>
<item>
<a>a2</a>
<b>b2</b>
<c>c2</c>
</item>
</root>