这个解决方案比当前接受的答案稍微短一些,更加高效。同时,在元素具有属性的情况下也可以正确地工作。
<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:variable name="vUpper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vLower" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:template match="*">
<xsl:variable name="vEName"><xsl:call-template name="PCase"/></xsl:variable>
<xsl:element name="{$vEName}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template name="PCase">
<xsl:param name="pName" select="translate(name(), $vUpper, $vLower)"/>
<xsl:if test="$pName">
<xsl:variable name="vNextToken" select="substring-before(concat($pName, '_'), '_')"/>
<xsl:value-of select=
"concat(translate(substring($vNextToken,1,1), $vLower, $vUpper),
substring($vNextToken,2))"/>
<xsl:call-template name="PCase">
<xsl:with-param name="pName" select="substring-after($pName, '_')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
当应用于以下XML文档(提供的带有添加属性的文档)时:
<TAG_ONE x="y">
<TAG_TWO>Abc</TAG_TWO>
<TAG_THREE>Xyz</TAG_THREE>
</TAG_ONE>
所需的正确结果已生成:
<TagOne x="y">
<TagTwo>Abc</TagTwo>
<TagThree>Xyz</TagThree>
</TagOne>
"node() | @*"
,以防万一有任何属性,但由于OP的要求中没有属性,这可能是不必要的。 - Flynn1179