2013-06-04 123 views
0

我正在嘗試合併兩個xml文件和基於條件的更新。在第一個文件中,您會注意到有3個SECTION_SUMMARY序列。第三序列的LockAuthority Attetete爲「1」。用xslt和條件合併2個xml文件

File1.xml 
    <DOCUMENT> 
     <LOANS> 
     <LOAN SequenceNumber="1" xlink:label="LOAN1" LoanRoleType="SubjectLoan"> 
    <DOCUMENT_SETS> 
    <DOCUMENT_SET> 
     <GFE> 
     <SECTION_SUMMARIES> 
     <SECTION_SUMMARY SequenceNumber="1"> 
     <Amount>1975.00</Amount> 
     <Type>A</Type> 
     </SECTION_SUMMARY> 
     <SECTION_SUMMARY SequenceNumber="2">  
     <Amount>9751.44</Amount> 
     <Type>B</Type>      
     </SECTION_SUMMARY> 
     <SECTION_SUMMARY SequenceNumber="3" LockAuthority="1"> 
     <Amount>3750.00</Amount> 
     <Type>A</Type> 
     </SECTION_SUMMARY> 
     </SECTION_SUMMARIES> 
     </GFE> 
    </DOCUMENT_SET> 
    </DOCUMENT_SETS> 
    <ESCROW> 
    <ESCROW_DETAIL> 
     <InsuranceIndicator>true</InsuranceIndicator> 
     <AllPropertyTaxesIndicator>true</AllPropertyTaxesIndicator> 
     <OtherDescription>HOA</OtherDescription> 
    </ESCROW_DETAIL> 
    </ESCROW> 
     </LOAN> 
     </LOANS> 
    </DOCUMENT> 

在第二個文件中有序列3到5.出現在兩個文件中的序列3具有值爲「2」的LockAuthority屬性。如果該值大於或等於文件1中的值,則值來自File1的File2 else值。我也想要任何沒有在File1中合併的LockAuthority的數據點。如果沒有LockAuthority,則來自File2的數據將佔上風。

File2.xml 
    <DOCUMENT> 
    <LOANS> 
    <LOAN SequenceNumber="1" xlink:label="LOAN1" LoanRoleType="SubjectLoan"> 
     <DOCUMENT_SETS> 
    <DOCUMENT_SET> 
    <GFE> 
     <SECTION_SUMMARIES> 
     <SECTION_SUMMARY SequenceNumber="3" LockAuthority="2"> 
     <Amount>200.00</Amount> 
     <Type>Header</Type> 
     </SECTION_SUMMARY> 
     <SECTION_SUMMARY SequenceNumber="4"> 
     <Amount>-3000.00</Amount> 
     <Type>Two</Type>      
     </SECTION_SUMMARY> 
     <SECTION_SUMMARY SequenceNumber="5"> 
     <Amount>5392.25</Amount> 
     <Type>Three</Type> 
     </SECTION_SUMMARY> 
     </SECTION_SUMMARIES> 
    </GFE> 
    </DOCUMENT_SET> 
     </DOCUMENT_SETS> 
    </LOAN> 
    </LOANS> 
    </DOCUMENT> 

生成的文件應該看起來像這樣。

<DOCUMENT> 
    <LOANS> 
    <LOAN SequenceNumber="1" xlink:label="LOAN1" LoanRoleType="SubjectLoan"> 
     <DOCUMENT_SETS> 
    <DOCUMENT_SET> 
    <GFE> 
     <SECTION_SUMMARIES> 
     <SECTION_SUMMARY SequenceNumber="1"> 
     <Amount>1975.00</Amount> 
     <Type>A</Type> 
     </SECTION_SUMMARY> 
     <SECTION_SUMMARY SequenceNumber="2"> 
     <Amount>9751.44</Amount>  
     <Type>B</Type>      
     </SECTION_SUMMARY> 
     <SECTION_SUMMARY SequenceNumber="3" LockAuthority="2"> 
     <Amount>200.00</Amount> 
     <Type>Header</Type> 
     </SECTION_SUMMARY> 
     <SECTION_SUMMARY SequenceNumber="4"> 
     <Amount>-3000.00</Amount> 
     <Type>Two</Type>      
     </SECTION_SUMMARY> 
     <SECTION_SUMMARY SequenceNumber="5"> 
     <Amount>5392.25</Amount> 
     <Type>Three</Type> 
     </SECTION_SUMMARY> 
     </SECTION_SUMMARIES> 
    </GFE> 
    </DOCUMENT_SET> 
     </DOCUMENT_SETS> 
     <ESCROW> 
    <ESCROW_DETAIL> 
    <InsuranceIndicator>true</InsuranceIndicator> 
    <AllPropertyTaxesIndicator>true</AllPropertyTaxesIndicator> 
    <OtherDescription>HOA</OtherDescription> 
    </ESCROW_DETAIL> 
     </ESCROW> 
    </LOAN> 
    </LOANS> 
    </DOCUMENT> 

任何和所有的幫助,非常感謝!

回答

0

這裏是直接的解決方案(可以通過使用xsl:key來改進)。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:variable name="f2" select="document('ic4_2.xml')"/> 
    <xsl:variable name="SECTION_SUMMARY_F1" select="//SECTION_SUMMARY"/> 

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

    </xsl:template> 

    <xsl:template match="SECTION_SUMMARY[@LockAuthority]"> 
     <xsl:variable name="SECTION_SUMMARY_F2" select="$f2//SECTION_SUMMARY[@SequenceNumber = current()/@SequenceNumber]" /> 
     <xsl:choose> 
      <xsl:when test="$SECTION_SUMMARY_F2/@LockAuthority > @LockAuthority"> 
       <xsl:apply-templates select="$SECTION_SUMMARY_F2" mode="copy"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:apply-templates select="." mode="copy"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="SECTION_SUMMARIES"> 
     <xsl:copy> 
      <!-- from file 1--> 
      <xsl:apply-templates /> 
      <!-- from file 2--> 
      <xsl:for-each select="$f2//SECTION_SUMMARY[not(@SequenceNumber = $SECTION_SUMMARY_F1/@SequenceNumber)]" > 
       <xsl:copy-of select="."/> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/" > 
     <xsl:apply-templates /> 
    </xsl:template> 

</xsl:stylesheet> 
+0

我將第5行的文件名更改爲我的文件名並執行此操作。我只獲取了File1中的數據。我錯過了什麼? – user2452998

+0

應該工作。 (我用xsltproc測試過)XML文件和xslt在同一個目錄下嗎?你用你發佈的xml文件做測試嗎?也許在你的測試中涉及命名空間(因爲xlink:label)? –

+0

文件全部位於同一個目錄中。將你的答案複製到新文件並保存到同一個目錄。將新的xslt分配給File1並執行XSL轉換。我正在使用XMLSpy。試過去除標籤。我正在使用我發佈的相同文件。還有什麼建議? – user2452998