2013-03-04 16 views
6

XSLTを使用して2つのxmlファイルを1つにマージする必要があります。2つのxmlファイルをXSLTとマージする方法

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

所望のマージ結果 - 最初のを更新するために第2のXMLを使用して1:

<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をサポートしていますか? –

+0

こんにちはJim、私のプロジェクトでxslt1が使用されています。ありがとう。 – skyfree

+1

stackoverflowを検索したときに、おそらく[昨日回答した自分の質問](http://stackoverflow.com/q/15175287/1945651)が見つかりましたか? – JLRishe

答えて

9

私はあなたの新しいXML形式に一致するように変更され、あなたの最後の質問に提供されるほとんど同じ答え:「updates.xmlとして保存された秒1で、最初のサンプル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> 

<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

ありがとう、あなたは命の救世主です!どのようにまだ少し問題がある。実際には、マージする必要があるすべてのエントリの前にヘッダーがあります。元のquesitonを変更しました。 – skyfree

+0

JLRishe、@JLRisheあなたのソリューションは、ヘッダー部分を大きく変えることができます。申し訳ありませんが私の不完全な説明、私はそれを把握しようとしたが、動作しませんでした。助けてください。どうもありがとう。 – skyfree

+0

私は上記の私の答えを更新しました。ヘッダーの値をマージするか、元のXMLの値をそのまま使用する必要がありますか? – JLRishe

関連する問題