Я не очень понимаю, причём тут ключи (в смысле xsl:key). Но группировку можно делать рекурсией, последовательно выбирая группу с одинаковым ключом (ключевым значением), затем все с ключами, больше текущего, и к последней применяя общее правило.
Например:
<?xml version="1.0" encoding="utf-8"?>
<Items>
<Item>
<Attribute1>D</Attribute1>
<Attribute2>2</Attribute2>
</Item>
<Item>
<Attribute1>B</Attribute1>
<Attribute2>1</Attribute2>
</Item>
<Item>
<Attribute1>A</Attribute1>
<Attribute2>1</Attribute2>
</Item>
<Item>
<Attribute1>C</Attribute1>
<Attribute2>2</Attribute2>
</Item>
</Items>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Items">
<Groups>
<xsl:apply-templates select="./Item" mode="first">
<xsl:sort select="./Attribute2"/>
</xsl:apply-templates>
</Groups>
</xsl:template>
<xsl:template match="Item" mode="first">
<xsl:if test="position()=1">
<xsl:variable name="key" select="Attribute2"/>
<Group>
<xsl:copy-of select="$key"/>
<xsl:apply-templates select="../Item[Attribute2 = $key]" mode="all"/>
</Group>
<xsl:apply-templates select="../Item[Attribute2 > $key]" mode="first"/>
</xsl:if>
</xsl:template>
<xsl:template match="Item" mode="all">
<Item>
<xsl:copy-of select="Attribute1"/>
</Item>
</xsl:template>
</xsl:stylesheet>
Сортировка тут нужна чисто для выбора самого младшего по значению ключа.
Результат:
<?xml version="1.0"?>
<Groups>
<Group>
<Attribute2>1</Attribute2>
<Item>
<Attribute1>B</Attribute1>
</Item>
<Item>
<Attribute1>A</Attribute1>
</Item>
</Group>
<Group>
<Attribute2>2</Attribute2>
<Item>
<Attribute1>D</Attribute1>
</Item>
<Item>
<Attribute1>C</Attribute1>
</Item>
</Group>
</Groups>