I have an xml like this:
I want to transform it to
This should do it, not quite sure of the {name()} but you could replace that with "person"
> <xsl:template match="person">
> <xsl:element name="{name()}">
> <xsl:attribute name="id">
> <xsl:value-of select="@name"/>
> </xsl:attribute>
> <xsl:attribute name="gender">
> <xsl:value-of select="@gender"/>
> </xsl:attribute>
> </xsl:element>
> </xsl:template>
This is very simple: Use the identity transform and create a template that transforms the name
attribute:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@name">
<xsl:attribute name="id">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
This will leave everything in the document except for name
attributes exactly as it is. If you only want to change the name
attribute on person
elements, put a more restrictive XPath in the template's match
attribute, e.g. person/@name
.