2013-03-04 35 views
6

Tôi có hai tệp xml cần được hợp nhất thành một tệp bằng cách sử dụng XSLT.cách Hợp nhất hai tệp xml với XSLT

XML đầu tiên là (một trong những bản gốc):

<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 Thứ hai (dữ liệu cập nhật) là như thế này:

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

Các mong muốn sáp nhập kết quả - bằng cách sử dụng XML thứ hai để cập nhật đầu tiên một:

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

Tôi đã tìm kiếm stackoverflow nhưng vẫn không thể tìm thấy câu trả lời. Cảm ơn vì sự giúp đỡ.

+0

Khó khăn trong XSLT1 mà không sử dụng các phần mở rộng; tầm thường trong XSLT2. Bạn đang sử dụng bộ xử lý XSLT nào và nó có hỗ trợ XSLT2 không? –

+0

Xin chào Jim, xslt1 được sử dụng trong dự án của tôi. cảm ơn. – skyfree

+1

Khi bạn tìm kiếm stackoverflow, bạn có thể tìm thấy [câu hỏi của riêng bạn đã được trả lời ngày hôm qua] (http://stackoverflow.com/q/15175287/1945651)? – JLRishe

Trả lời

9

Khá nhiều câu trả lời tương tự như tôi cung cấp cho câu hỏi cuối cùng của bạn, sửa đổi để phù hợp với định dạng XML mới của bạn:

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

Khi chạy trên XML mẫu đầu tiên, với một thứ hai lưu dưới dạng "updates.xml ", điều này tạo ra:

<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

Cảm ơn bạn, bạn là một vị cứu tinh cuộc sống! Làm thế nào vẫn còn một chút vấn đề. thực sự, có một tiêu đề trước tất cả các mục cần được hợp nhất quá .. Tôi đã sửa đổi quesiton ban đầu. – skyfree

+0

JLRishe, @JLRishe Giải pháp của bạn hoạt động rất tốt, đánh dấu phần tiêu đề. xin lỗi vì mô tả không đầy đủ của tôi, tôi đã cố gắng tìm ra, nhưng không hoạt động. Hãy giúp tôi. Cảm ơn rất nhiều. – skyfree

+0

Tôi đã cập nhật câu trả lời của mình ở trên. Bạn có cần phải hợp nhất các giá trị tiêu đề hay chỉ sử dụng các giá trị từ XML gốc? – JLRishe

Các vấn đề liên quan