我认为这是最接近你想要的:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="custom-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<CONTENT>
<xsl:sequence select="f:rename('TEST1', /Document/test/id1)"/>
<xsl:sequence select="f:rename('TEST2', /Document/test/id2)"/>
</CONTENT>
</xsl:template>
<xsl:function name="f:rename">
<xsl:param name="name" as="xs:string"/>
<xsl:param name="toWrap" />
<xsl:if test="$toWrap">
<xsl:element name="{$name}">
<xsl:value-of select="$toWrap"/>
</xsl:element>
</xsl:if>
</xsl:function>
</xsl:stylesheet>
在以下输入上运行时:
<Document>
<test>
<id1>Hello!</id1>
<id2>Hello again!</id2>
</test>
</Document>
产生的输出是:
<CONTENT>
<TEST1>Hello!</TEST1>
<TEST2>Hello again!</TEST2>
</CONTENT>
您也可以试试这个,它有点冗长,但与 XSLT 1.0 兼容:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<CONTENT>
<xsl:apply-templates select="/Document/test/id1" mode="rename">
<xsl:with-param name="name" select="'TEST1'" />
</xsl:apply-templates>
<xsl:apply-templates select="/Document/test/id2" mode="rename">
<xsl:with-param name="name" select="'TEST2'" />
</xsl:apply-templates>
</CONTENT>
</xsl:template>
<xsl:template match="@* | node()" mode="rename">
<xsl:param name="name" />
<xsl:element name="{$name}">
<xsl:value-of select="." />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在上面的示例 XML 上运行时,再次生成相同的输出。