Here's a template you can use that you won't have to create a new attribute for every existing attribute. What you're doing is creating the "id" attribute and then outputting all the attributes except for "name".
The extra "apply-templates" is for any children that <person>
might have. Remove it if you don't want to keep the children. (That sounds horrible, doesn't it? ;-)
I also included the identity transform template.
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="person">
<person id="{@name}">
<xsl:apply-templates select="@*[name() != 'name']"/>
<xsl:apply-templates/>
</person>
</xsl:template>