2010-12-05 12 views
2

Je souhaite supprimer les doublons lorsque toutes les variables correspondent exactement à xslt.Comment supprimer des xml-nodes en double en utilisant xslt?

Dans ce nœud xml 3 devrait être supprimé car il est une copie parfaite du noeud 1.

<root> 
    <trips> 
     <trip> 
     <got_car>0</got_car> 
     <from>Stockholm, Sweden</from> 
     <to>Gothenburg, Sweden</to> 
     <when_iso>2010-12-06 00:00</when_iso> 
     </trip> 
     <trip> 
     <got_car>0</got_car> 
     <from>Stockholm, Sweden</from> 
     <to>New york, USA</to> 
     <when_iso>2010-12-06 00:00</when_iso> 
     </trip> 
     <trip> 
     <got_car>0</got_car> 
     <from>Stockholm, Sweden</from> 
     <to>Gothenburg, Sweden</to> 
     <when_iso>2010-12-06 00:00</when_iso> 
     </trip> 
     <trip> 
     <got_car>1</got_car> 
     <from>Test, Duncan, NM 85534, USA</from> 
     <to>Test, Duncan, NM 85534, USA</to> 
     <when_iso>2010-12-06 00:00</when_iso> 
     </trip> 
    <trips> 
<root> 
+0

double possible de [Comment supprimer des nœuds XML double à l'aide XSLT] (http://stackoverflow.com/questions/355691/comment supprimer-dupliquer-xml-nodes-using-xslt) –

Répondre

1

Ce code:

<?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:key name="trip-tth" match="/root/trips/trip" use="concat(got_car, '+', from, '+', to, '+', when_iso)"/> 

<xsl:template match="root/trips"> 
    <xsl:copy> 
     <xsl:apply-templates select="trip[generate-id(.) = generate-id(key ('trip-tth', concat(got_car, '+', from, '+', to, '+', when_iso)))]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="trip"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

fera l'affaire.

Il utilise le fait que generate-id() appliqué à une clé prendra l'identifiant du premier noeud, qui correspond à un critère donné. Et dans notre cas, les critères sont la valeur concaténée de chaque élément enfant de voyage.

+3

@Flack: Généralement votre réponse n'est pas entièrement correcte. Chaque fois que la concaténation est utilisée comme clé, il est sûr et nécessaire d'inclure dans cette concaténation des chaînes de séparation, afin d'éviter de considérer 'concat ('A', 'BC')' et 'concat ('AB', 'C')' être le même". –

+0

En fait, pourriez-vous expliquer comment j'ai mis les nouvelles données dans un pour chaque tableau? – Himmators

+0

@Dimitre Novatchev, merci pour une remarque utile. J'ai édité ma réponse pour les futurs lecteurs. – Flack

2

Avec une meilleure desing, cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kTripByContent" match="trip" 
      use="concat(got_car,'+',from,'+',to,'+',when_iso)"/> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="trip[generate-id() != 
           generate-id(key('kTripByContent', 
               concat(got_car,'+', 
                from,'+', 
                to,'+', 
                when_iso))[1])]"/> 
</xsl:stylesheet> 

Sortie:

<root> 
    <trips> 
     <trip> 
      <got_car>0</got_car> 
      <from>Stockholm, Sweden</from> 
      <to>Gothenburg, Sweden</to> 
      <when_iso>2010-12-06 00:00</when_iso> 
     </trip> 
     <trip> 
      <got_car>0</got_car> 
      <from>Stockholm, Sweden</from> 
      <to>New york, USA</to> 
      <when_iso>2010-12-06 00:00</when_iso> 
     </trip> 
     <trip> 
      <got_car>1</got_car> 
      <from>Test, Duncan, NM 85534, USA</from> 
      <to>Test, Duncan, NM 85534, USA</to> 
      <when_iso>2010-12-06 00:00</when_iso> 
     </trip> 
    </trips> 
</root> 
Questions connexes