2010-04-20 20 views
10

que tienen un xml de esta manera:¿Cómo cambio el nombre de un atributo usando XSLT?

<person name="foo" gender = "male" /> 

quiero transformarlo a

<person id="foo" gender="male" /> 

¿Hay una manera de hacer que el uso de XSLT?

  • que tendrá una gran cantidad de nodos secundarios en persona

  • voy a tener más atributos de la persona.

+0

Eso se parece más a cambiar el nombre de un atributo para mí, a menos que haya más en su escenario real que no entró en la pregunta. –

Respuesta

13

Esto es muy simple: utilizar la identidad transformar y crear una plantilla que transforma el atributo name:

<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> 

Esto dejará todo en el documento a excepción de name atributos exactamente como es. Si solo desea cambiar el atributo name en person elementos, coloque una XPath más restrictiva en el atributo match de la plantilla, p. person/@name.

+0

Corto, limpio, simple. Excelente respuesta – markusk

+0

Funcionó maravillosamente. – unj2

-1

Esto debe hacerlo, no muy seguro de la {name()}, pero que podría sustituir a la "persona"

> <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> 
+0

¿Debo crear un atributo para cada atributo que tengo? ¿Puedo copiar todos los atributos excluyendo el id? – unj2

+0

Es una locura usar 'xsl: element', una plantilla de valor de atributo y la función' name() 'para crear un elemento cuyo nombre ya conozca. Reemplace '' con '' y también puede reemplazar los elementos 'xsl: attribute' con AVT. Haga todo eso y la respuesta aún no será correcta (la respuesta a la pregunta de kunjaan es "no, a menos que lo haga así"), pero será menos incorrecto. –

+0

Solo intento proporcionar una solución genérica que funcione para cualquier elemento, independientemente de su nombre. Si solo será para el elemento , entonces, por supuesto, la solución codificada más simple sería mejor. – derek

Cuestiones relacionadas