2012-06-28 5 views
3

Si j'ai un fichier XML qui ressemble à ceci:Comment puis-je ajouter un attribut XML en utilisant XSLT

<Component Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}"> 
<Component Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}"> 
<Component Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}"> 

Comment nous faire je XSLT pour ajouter « Win64 = « yes » » à la fin de chaque élément comme ceci:

<Component Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}" Win64="yes"> 
<Component Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}" Win64="yes"> 
<Component Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}" Win64="yes"> 

Répondre

2

Vous pouvez utiliser l'élément <xsl:attribute> et l'appliquer directement à (intérieur) l'élément <xsl:copy>:

<xsl:template match="Component"> 
    <xsl:copy> 
     <xsl:attribute name="Win64">yes</xsl:attribute> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

Mise à jour: embarqué dans un XSLT qui sinon copie le contenu Xml, cela ressemble à ceci:

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

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Component"> 
     <xsl:copy> 
      <xsl:attribute name="Win64">yes</xsl:attribute> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Mise à jour 2: Cela suppose que vous voulez seulement ajouter Win64="yes" à <Component> éléments. Si ce n'est pas le cas, vous devrez adapter l'expression XPath de l'attribut match dans le modèle qui insère votre attribut supplémentaire.

Mise à jour 3: documents d'entrée et de sortie bien formés:

Je suppose que ce que le document d'entrée:

<?xml version="1.0" encoding="UTF-8"?> 
<xml> 
    <Component Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}"/> 
    <Component Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}"/> 
    <Component Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}"/> 
</xml> 

Ensuite, la sortie de l'air XSLT mentionné ci-dessus comme ceci:

<?xml version="1.0" encoding="utf-8"?> 
<xml> 
    <Component Win64="yes" Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}" /> 
    <Component Win64="yes" Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}" /> 
    <Component Win64="yes" Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}" /> 
</xml> 
+0

Di ne fonctionne pas pour moi ... votre template produit ceci: ' cmp25217AE65B163B199EDDA7F29198730A {DEB29383-8BF1-4FD0-830B -DF8639F4069A} cmp93E1B1FFA5A62A43251E23BD65FBAA66 {76E8B8CE-835D-498E-9330-CE940C9510BF} cmp3D7B898C57056B0E87C3A964112BB9D6 {3BA9A892-C44F-4B2E-B0B9-B732120D35DB} ' –

+0

@SteveH. - Quel processeur utilisez-vous? Avez-vous d'autres modèles dans votre XSLT? Cela a bien fonctionné pour moi. (+1) –

+0

Cette sortie provenait de XMLSpy. Peut-être que Saxon serait différent, je pourrais essayer avec ça. –

-1

Malheureusement, vous ne pouvez pas utiliser <xsl:copy> et ajouter d'autres attributs. Je l'ai fait comme ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/root"> 
     <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="Component"> 
      <xsl:element name="Component"> 
       <xsl:attribute name="Id" select="@Id"/> 
       <xsl:attribute name="Guid" select="@Guid"/> 
       <xsl:attribute name="Win64" select="'yes'"/> 
      </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
+1

Quel processeur utilisez-vous? L'ajout d'attributs lors de l'utilisation de 'xsl: copy' devrait fonctionner correctement. –

+0

Merci pour votre aide! – user1489615

0

Cette feuille de style ajoutera l'attribut à tous les éléments comme vous avez demandé. Notez que la position de l'attribut peut ne pas être à la fin, mais cela ne devrait pas avoir d'importance.

XML Entrée (bien formée)

<doc> 
    <Component Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}"/> 
    <Component Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}"/> 
    <Component Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}"/> 
</doc> 

XSLT 1.0 (testé avec Xalan et Saxon 6.5.5)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="text()|comment()|processing-instruction()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:copy> 
      <xsl:attribute name="Win64">yes</xsl:attribute> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy>  
    </xsl:template> 

</xsl:stylesheet> 

sortie

<doc Win64="yes"> 
    <Component Win64="yes" Id="cmp25217AE65B163B199EDDA7F29198730A" Guid="{DEB29383-8BF1-4FD0-830B-DF8639F4069A}"/> 
    <Component Win64="yes" Id="cmp93E1B1FFA5A62A43251E23BD65FBAA66" Guid="{76E8B8CE-835D-498E-9330-CE940C9510BF}"/> 
    <Component Win64="yes" Id="cmp3D7B898C57056B0E87C3A964112BB9D6" Guid="{3BA9A892-C44F-4B2E-B0B9-B732120D35DB}"/> 
</doc> 
Questions connexes