Для XSLT 2.0 вы можете использовать для каждой группы
<xsl:template match="root">
<xsl:for-each-group select="DATA" group-by="CODE">
<DATA>
<CODE><xsl:value-of select="CODE"/></CODE>
<IMAGES>
<xsl:copy-of select="current-group()//IMAGE"></xsl:copy-of>
</IMAGES>
</DATA>
</xsl:for-each-group>
</xsl:template>
и для XSLT 1.0 вы можете использовать метод Мюнхена
<xsl:key name="datakey" match="DATA" use="CODE"/>
<xsl:template match="root">
<xsl:for-each select="DATA[generate-id(.) = generate-id(key('datakey', CODE))]">
<DATA>
<CODE><xsl:value-of select="CODE"/></CODE>
<IMAGES>
<xsl:for-each select="//IMAGES[../CODE = current()/CODE]">
<xsl:copy-of select="IMAGE"></xsl:copy-of>
</xsl:for-each>
</IMAGES>
</DATA>
</xsl:for-each>
</xsl:template>
Оба сценария конвертируют этот Вывод
<DATA>
<CODE>1</CODE>
<IMAGES>
<IMAGE>1</IMAGE>
<IMAGE>2</IMAGE>
</IMAGES>
</DATA>