2017-06-07 1 views
1

J'ai beaucoup de fichiers XML qui contiennent des attributs d'une valeur mal orthographié:XSLT: Renommer attribut si existe pas

<Part id="1"> 
    <Attribute Name="Colo" Value="Red" /> 
</Part> 

Colo devrait être Color. Maintenant, dans certains fichiers cela a été corrigé manuellement, puis les deux attributs existent:

<Attribute Name="Colo" Value="Red" /> 
<Attribute Name="Color" Value="Blue" /> 

J'ai une transformation XSL qui renomme l'attribut Colo-Color mais je ne sais pas comment éviter que lorsque l'attribut corrigé existe déjà.

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

<xsl:template match="Attribute/@Name[. = 'Colo']"> 
    <xsl:attribute name="Name"> 
     <xsl:value-of select="'Color'"/> 
    </xsl:attribute> 
</xsl:template> 

Comment ne pas renommer s'il y a déjà l'attribut correct?

+0

Ne devriez-vous * supprimer * l'ensemble de l'élément 'Attribute' avec un nom' Colo' lorsque la version corrigée existe? –

+0

Ce serait mieux et c'est ce que je fais ensuite :) –

+1

Confondre que vos "attributs" sont en fait des éléments, et que leurs "noms" sont en fait les valeurs de leurs attributs "nom" ... –

Répondre

2

Je pense que vous voulez faire:

XSLT 1,0

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

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

<xsl:template match="Attribute[@Name = 'Colo']"> 
    <xsl:if test="not(../Attribute[@Name = 'Color'])"> 
     <Attribute Name="Color" Value="{@Value}" /> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

Cela modifiera l'élément Attribute avec le nom mal orthographié si elle ne possède pas de frères et soeurs avec le nom correct; sinon, il va simplement l'enlever.