2013-03-04 96 views
6

我有兩個xml文件需要通過使用XSLT合併成一個文件。如何用XSLT合併兩個xml文件

首先XML是(原來的):

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

第二XML(更新後的數據)是這樣的:

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

期望合併結果 - 使用所述第二XML來更新第一一個:

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

我已經搜索了stackoverflow,但仍然找不到答案。感謝幫助。

+0

在不使用擴展名的情況下在XSLT1中很難做到;在XSLT2中微不足道。你在使用哪種XSLT處理器?它支持XSLT2嗎? – 2013-03-04 04:57:42

+0

嗨吉姆,xslt1用於我的項目。謝謝。 – skyfree 2013-03-04 05:01:47

+1

當你搜索stackoverflow你有沒有發現[你自己的問題昨天回答](http://stackoverflow.com/q/15175287/1945651)? – JLRishe 2013-03-04 07:15:22

回答

9

差不多,我給你的最後一個問題,修改,以符合新的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> 

當第一個樣本XML運行,與第二個保存爲「updates.xml 「,產生如下結果:

<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

謝謝你,你是一個救世主!如何還有一點問題。實際上,在所有需要合併的條目之前都有一個標題。我修改了原始問題。 – skyfree 2013-03-04 09:36:39

+0

JLRishe,@JLRishe您的解決方案非常適用於標題部分。對於我不完整的描述感到抱歉,我試圖找出它,但沒有奏效。請幫忙。非常感謝。 – skyfree 2013-03-04 09:47:30

+0

我已經更新了我上面的答案。你是否還需要合併標題值,還是隻使用原始XML中的值? – JLRishe 2013-03-04 11:01:27