这是您需要的完整样式表(因为命名空间很重要):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:z="foo">
<xsl:template match="root">
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<xsl:template match="z:row">
<xsl:variable name="A" select="@A" />
<xsl:for-each select="@*[local-name() != 'A']">
<z:row A="{$A}">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="." />
</xsl:attribute>
</z:row>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我更喜欢使用文字结果元素(例如<z:row>
)而不是<xsl:element>
属性值模板({}
属性值中的 s),而不是<xsl:attribute>
尽可能地使用它,因为它使代码更短,并且更容易查看您正在生成的结果文档的结构. 其他人更喜欢<xsl:element>
,<xsl:attribute>
因为那样一切都是 XSLT 指令。
如果您使用的是 XSLT 2.0,那么有几个语法细节会有所帮助,即except
XPath 中的运算符和直接在 上使用select
属性的能力<xsl:attribute>
:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
xmlns:z="foo">
<xsl:template match="root">
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<xsl:template match="z:row">
<xsl:variable name="A" as="xs:string" select="@A" />
<xsl:for-each select="@* except @A">
<z:row A="{$A}">
<xsl:attribute name="{local-name()}" select="." />
</z:row>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>