2013-03-04 19 views
6

Ich habe zwei XML-Dateien, die mit XSLT zu einem zusammengeführt werden müssen.wie zwei XML-Dateien mit XSLT verschmelzen

Erste XML ist (das Original):

<feed> 
    <author> 
    <firstName>f</firstName> 
    <lastName>l</lastName> 
    </author> 
    <date>2011-01-02 </date> 
    <entry> 
    <id>1</id> 
    <Name>aaa</Name> 
    <Content>XXX</Content>  
    </entry> 
    <entry> 
    <id>2</id> 
    <Name>bbb</Name> 
    <Content>YYY</Content> 
    </entry> 
</feed> 

Zweite XML (aktualisierte Daten) ist wie folgt:

<feed> 
     <author> 
     <firstName>f</firstName> 
     <lastName>l</lastName> 
     </author> 
     <date>2012-05-02 </date> 
     <entry> 
     <id>2</id> 
     <Name>newName</Name> 
     <Content>newContent</Content>  
     </entry> 
     <entry> 
     <id>3</id> 
     <Name>ccc</Name> 
     <Content>ZZZ</Content> 
     </entry> 
    </feed> 

Das fusionierte gewünschte Ergebnis - die zweite XML unter Verwendung der ersten aktualisieren eins:

<feed> 
     <author> 
     <firstName>f</firstName> 
     <lastName>l</lastName> 
     </author> 
     <date>2012-05-02 </date> 
     <entry> 
     <id>1</id> 
     <Name>aaa</Name> 
     <Content>XXX</Content>  
     </entry>  
     <entry> 
     <id>2</id> 
     <Name>newName</Name> 
     <Content>newContent</Content>  
     </entry> 
     <entry> 
     <id>3</id> 
     <Name>ccc</Name> 
     <Content>ZZZ</Content> 
     </entry> 
    </feed> 

Ich habe Stackoverflow gesucht, konnte aber immer noch nicht die Antwort finden. Danke für die Hilfe.

+0

Tough in XSLT1 ohne Verwendung von Erweiterungen; trivial in XSLT2. Welchen XSLT-Prozessor verwenden Sie und unterstützt XSLT2? –

+0

Hallo Jim, xslt1 wird in meinem Projekt verwendet. Vielen Dank. – skyfree

+1

Als Sie stackoverflow gesucht haben, haben Sie vielleicht [Ihre eigene Frage, die gestern beantwortet wurde] gefunden (http://stackoverflow.com/q/15175287/1945651)? – JLRishe

Antwort

9

So ziemlich die gleiche Antwort wie ich auf Ihre letzte Frage zur Verfügung gestellt, veränderte Ihr neues XML-Format entsprechen:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:param name="fileName" select="'updates.xml'" /> 
    <xsl:param name="updates" select="document($fileName)" /> 

    <xsl:variable name="updateItems" select="$updates/feed/entry" /> 

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

    <xsl:template match="feed"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()[not(self::entry)] | 
            entry[not(id = $updateItems/id)]" /> 
     <xsl:apply-templates select="$updateItems" /> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Wenn auf dem ersten Probe XML laufen, um mit der zweiten als „updates.xml gespeichert Dies erzeugt:

<feed> 
    <author> 
    <firstName>f</firstName> 
    <lastName>l</lastName> 
    </author> 
    <date>2011-01-02 </date> 
    <entry> 
    <id>1</id> 
    <Name>aaa</Name> 
    <Content>XXX</Content> 
    </entry> 
    <entry> 
    <id>2</id> 
    <Name>newName</Name> 
    <Content>newContent</Content> 
    </entry> 
    <entry> 
    <id>3</id> 
    <Name>ccc</Name> 
    <Content>ZZZ</Content> 
    </entry> 
</feed> 
+0

Danke, du bist ein Lebensretter! Wie es noch ein kleines Problem gibt. tatsächlich gibt es einen Header vor allen Einträgen, die auch zusammengeführt werden müssen. Ich habe die ursprüngliche Frage geändert. – skyfree

+0

JLRishe, @JLRishe Ihre Lösung funktioniert hervorragend, abgesehen vom Header-Teil. Entschuldigung für meine unvollständige Beschreibung, ich habe versucht, es herauszufinden, aber hat nicht funktioniert. bitte hilfe. Danke vielmals. – skyfree

+0

Ich habe meine Antwort oben aktualisiert. Müssen Sie auch die Header-Werte zusammenführen oder nur diejenigen aus dem ursprünglichen XML verwenden? – JLRishe

Verwandte Themen