Вот краткое и простое, полное решение :
<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="B[@id]/C">
<C name="{../@id}">
<xsl:copy-of select="node()"/>
</C>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML (исправлено, чтобы оно было правильно сформировано):
<A>
<B id="x">
<C>
<D/>
<D/>
<D/>
<D/>
</C>
</B>
</A>
желаемый, правильный результат получается :
<C name="x">
<D/>
<D/>
<D/>
<D/>
</C>
Объяснение
Правильное использование сопоставления шаблонов.
Использование AVT .