2008-12-10 8 views
3

J'ai un fichier XML très longue, commeComment supprimer des nœuds XML en double en utilisant XSLT

<Root> 
    <ele1> 
     <child1>context1</child1> 
     <child2>test1</child2> 
     <child1>context1</child1> 
    </ele1> 

    <ele2> 
     <child1>context2</child1> 
     <child2>test2</child2> 
     <child1>context2</child1> 
    </ele2> 
    <ele3>...........<elen> 
</Root> 

Maintenant, je veux supprimer toutes les secondes <child1> dans chaque <ele> en utilisant xslt, est-il possible? Le résultat serait comme ceci:

<Root> 
    <ele1> 
     <child1>context1</child1> 
     <child2>test1</child2> 
    </ele1> 

    <ele2> 
     <child1>context2</child1> 
     <child2>test2</child2> 
    </ele2> 
     <ele3>...........<elen> 
</Root> 

Merci u, BR

Allen

Répondre

-1

Votre xml et question sont un peu floue, mais ce que vous cherchez est communément appelé la méthode Muenchian Grouping - C'est une autre façon de demander des nœuds distincts. Avec les touches appropriées, cela peut être fait très efficacement.

+0

Ceci est plus d'un soupçon qu'une réponse. Les gens ont besoin de réponses sérieuses et responsables. –

+0

Démontrez de quelle manière cela est irresponsable ou insignifiant. Veuillez fournir une URL qui indique clairement que toutes les réponses sur l'offre à commandes doivent être complètes et définitives, quelle que soit la qualité de la question. Indiquez ce que vous espériez accomplir avec vos commentaires ** mois ** après que la question a été posée. – annakata

+0

Je suis content que vous ayez trouvé le temps de baisser celui-ci Dimitre, je pense qu'il y en a d'autres et vous aurez le set. – annakata

4

Cette question nécessite un peu réponse plus détaillée que juste en montrant une bonne source Muenchian Grouping.

La raison est que le regroupement nécessaire nécessite d'identifier à la fois les noms de tous les enfants d'un élément «ele [SomeString]» et leur parent. Such grouping nécessite de définir une clé qui est définie de manière unique par les deux sources uniques, généralement via la concaténation.

Cette transformation:

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

<xsl:key name="kElByName" match="*" 
     use="concat(generate-id(..), '+',name())"/> 

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

    <xsl:template match="*[starts-with(name(), 'ele')]"> 
     <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates select= 
     "*[generate-id() 
      = 
      generate-id(key('kElByName', 
         concat(generate-id(..), '+',name()) 
         )[1]) 
      ]" 
     /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur ce document XML:

 
<Root> 
    <ele1> 
     <child1>context1</child1> 
     <child2>test1</child2> 
     <child1>context1</child1> 
    </ele1> 
    <ele2> 
     <child1>context2</child1> 
     <child2>test2</child2> 
     <child1>context2</child1> 
    </ele2> 
    <ele3> 
     <child2>context2</child2> 
     <child2>test2</child2> 
     <child1>context1</child1> 
    </ele3> 
</Root> 

produit le résultat recherché:

 
<Root> 
    <ele1> 
     <child1>context1</child1> 
     <child2>test1</child2> 
    </ele1> 
    <ele2> 
     <child1>context2</child1> 
     <child2>test2</child2> 
    </ele2> 
    <ele3> 
     <child2>context2</child2> 
     <child1>context1</child1> 
    </ele3> 
</Root> 
1

Si le XML fourni OP est représentatif de son/sa question (et la 2ème<child1> l'intérieur de chaque élément <ele*> doit être retiré), puis Muenchian Groupement n'est pas nécessaire:

XSLT:

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

    <!-- Identity Template: copies everything as-is --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Remove the 2nd <child1> element from each <ele*> element --> 
    <xsl:template match="*[starts-with(name(), 'ele')]/child1[2]" /> 

</xsl:stylesheet> 

Lorsqu'il est exécuté sur le XML fourni:

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <ele1> 
    <child1>context1</child1> 
    <child2>test1</child2> 
    <child1>context1</child1> 
    </ele1> 
    <ele2> 
    <child1>context2</child1> 
    <child2>test2</child2> 
    <child1>context2</child1> 
    </ele2> 
</Root> 

... est le résultat souhaité:

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <ele1> 
    <child1>context1</child1> 
    <child2>test1</child2> 
    </ele1> 
    <ele2> 
    <child1>context2</child1> 
    <child2>test2</child2> 
    </ele2> 
</Root> 
Questions connexes