Вот общее решение, которое принимает замены имени, которые должны быть сделаны в качестве параметров :
<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:param name="pReps">
<e oldName="a" newName="AAA"/>
<e oldName="apple" newName="BB"/>
<a oldName="color" newName="bbb"/>
</xsl:param>
<xsl:variable name="vReps" select=
"document('')/*/xsl:param[@name='pReps']"/>
<xsl:template match="*">
<xsl:element name=
"{$vReps/e[@oldName = name(current())]/@newName}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name=
"{$vReps/a[@oldName = name(current())]/@newName}">
<xsl:value-of select="concat('#', name(..))"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML :
<a>
<apple color="red"/>
</a>
желаемый, правильный результат получается :
<AAA>
<BB bbb="#apple"/>
</AAA>