2013-03-04 3 views
6

Ho due file xml che devono essere uniti in uno utilizzando XSLT.come unire due file xml con XSLT

Prima XML è (quello originale):

<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> 

Seconda XML (dati aggiornati) è come questo:

<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> 

Il risultato fuse desiderato - utilizzando la seconda XML per aggiornare la prima uno:

<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> 

Ho cercato lo stackoverflow ma non sono riuscito a trovare la risposta. Grazie per l'aiuto.

+0

Duro in XSLT1 senza utilizzo di estensioni; banale in XSLT2. Quale processore XSLT stai usando e supporta XSLT2? –

+0

Ciao Jim, xslt1 è usato nel mio progetto. Grazie. – skyfree

+1

Quando hai cercato lo stackoverflow hai forse trovato [la tua domanda a cui è stata data risposta ieri] (http://stackoverflow.com/q/15175287/1945651)? – JLRishe

risposta

9

Praticamente la stessa risposta che ho fornito alla sua ultima domanda, modificato in base ai nuovo formato XML:

<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> 

Quando eseguito il primo XML di esempio, con il secondo salvato come "updates.xml ", questo produce:

<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

Grazie, sei un salvatore di vita! Come c'è ancora un po 'di problemi. in realtà, c'è un'intestazione prima di tutte le voci che devono essere unite anche io. Ho modificato il quesiton originale. – skyfree

+0

JLRishe, @JLRishe La soluzione funziona benissimo, tranne la parte dell'intestazione. scusa per la mia descrizione incompleta, ho cercato di capirlo, ma non ha funzionato. per favore aiuto. Molte grazie. – skyfree

+0

Ho aggiornato la mia risposta sopra. Devi anche unire i valori dell'intestazione o semplicemente utilizzare quelli dell'XML originale? – JLRishe