2010-06-30 4 views
2

J'ai un peu de Xml qui ressemble à ceci:Comment ajouter un attribut spécifique à chaque noeud dans un fichier Xml en utilisant Xsl?

<books> 
    <book id="1"> 
    <name>My book</name> 
    <author>My author</author> 
    </book> 
    <book id="2"> 
    <name>My other book</name> 
    <author>My other author</author> 
    </book> 
</books> 

Je voudrais avoir ressembler à:

<books> 
    <book id="1"> 
    <name id="1">My book</name> 
    <author id="1">My author</author> 
    </book> 
    <book id="2"> 
    <name id="2">My other book</name> 
    <author id="2">My other author</author> 
    </book> 
</books> 

Quelqu'un pourrait-il me diriger dans la bonne direction?

Répondre

4
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!--Standard identity template that copies all content --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!--special template for elements who's parent has an @id --> 
    <xsl:template match="*[../@id]"> 
     <xsl:copy> 
      <xsl:copy-of select="../@id" /> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

+1 pour la réponse exacte. Je n'ai qu'un seul problème avec votre style d'écriture: il est toujours préférable de ne pas utiliser un axe inverse, si possible, dans une expression XPath et en particulier dans les motifs de correspondance. Au lieu de '* [../@ id]' on peut écrire: '* [@ id]/*'. Non seulement c'est plus court, mais c'est beaucoup plus compréhensible. –

+0

@Dimitre - Merci pour la suggestion. Il lit plus facilement de cette façon. Savez-vous si les instructions XPATH de l'axe avant sont généralement plus performantes ou est-ce surtout une question de style/convention? –

+0

En outre, si vous associez le dernier attribut pour un élément dont le père a @id, vous pouvez réduire le modèle à seulement deux 'copy' –

Questions connexes