Полное и краткое решение :
<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="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="exchangeRates">
<xchgRates>
<xsl:apply-templates select="node()|@*"/>
</xchgRates>
</xsl:template>
<xsl:template match="rate">
<entry xrate="{.}">
<xsl:value-of select="@country"/>
</entry>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML:
<exchangeRates>
<rate country="aud">0.97</rate>
</exchangeRates>
желаемый, правильный результат получается :
<xchgRates>
<entry xrate="0.97">aud</entry>
</xchgRates>
Объяснение :
Использование и переопределение правила идентификации / template
Использование AVT ( Шаблоны-значения-атрибуты ) рекомендуется, так как для этого требуется меньше набирать текст и получается более короткий, более понятный и понятный код .
Почти все атрибуты инструкций XSLT с несколькими исключениями (в частности, атрибут select
) допускают AVT.