示例xml 文件如下所示
<a>
<apple color="red"/>
</a>
我应该在XSLT中写什么才能获得下面的示例输出?
<AAA>
<BB bbb="#apple"/> <!-- if possible make it auto close -->
</AAA>
答案 0 :(得分:2)
这是一个通用解决方案,接受名称替换作为参数:
<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>
答案 1 :(得分:1)
使用name()
或local-name()
函数:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/a">
<AAA>
<xsl:apply-templates/>
</AAA>
</xsl:template>
<xsl:template match="*">
<BB bbb="{concat('#', name())}"/>
</xsl:template>
</xsl:stylesheet>