2009-03-30 7 views
3

je créer un lien pour transformer XML avec des attributs comme l'attribut 'nom' dans ce qui suit:Comment puis-je transformer un attribut d'élément en un nom d'élément dans XSLT?

<books> 
    <book name="TheBumperBookOfXMLProgramming"/> 
    <book name="XsltForDummies"/> 
</books> 

en éléments appelés ce qui était dans l'attribut name:

<books> 
    <TheBumperBookOfXMLProgramming/> 
    <XsltForDummies/> 
</books> 

en utilisant XSLT. Des idées?

+0

Tant le Les réponses ci-dessous sont valables. @ divo est exactement ce que j'ai demandé, @ Martin est une considération supplémentaire à garder à l'esprit. Merci aux deux :) – Brabster

+0

Pourquoi voulez-vous faire cela? Cela n'a pas beaucoup de sens. – AmbroseChapel

+0

@Ambrose - curiosité? En outre, il semble plus simple de définir un XMLSchema pour ce dernier. – Brabster

Répondre

4

Vous pouvez créer des éléments par nom en utilisant xsl:element:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
    <books> 
     <xsl:apply-templates /> 
    </books> 

    </xsl:template> 

    <xsl:template match="book"> 
    <xsl:element name="{@name}" /> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Cela laisse ouverte la possibilité de créer un fichier xml non valide (read: not xml) car le jeu de caractères est plus restreint avec les noms d'éléments. – pc1oad1etter

+0

@ pc1oad1etter: Comment est-il plus restreint? Autant que je sache, les deux sont des noms selon cette [règle de production] (http://www.w3.org/TR/REC-xml/#NT-Name) –

3
<xsl:template match="book"> 
    <xsl:element name="{@name}"> 
     <xsl:copy-of select="@*[name()!='name'] /> 
    </xsl:element> 
</xsl:template> 

cette copie également sur toutes les propriétés sur <book> pas nommé 'nom'

<book name="XsltForDummies" id="12" /> 

se transformeront en

<XsltForDummies id="12 /> 
Questions connexes