I have an xml like this:
<person name="foo" gender = "male" />
I want to transform it to
<person id="foo" gender="male" />
Is there a way to do that using XSLT?
I will have a lot of child nodes in person
开发者_StackOverflow中文版I will have more attributes in the person.
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
.
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>
精彩评论