使用xslt和conditionality合并2个xml文件

时间:2013-06-04 19:53:11

标签: xml xslt xslt-1.0

我正在尝试将两个xml文件与基于条件的更新合并。在第一个文件中,您会注意到有3个SECTION_SUMMARY序列。第3个序列的LockAuthority属性为“1”。

    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都有一个LockAuthority属性,其值为“2”。如果该值大于或等于文件1中的值,则值来自File1的File2 else值。我还想要任何没有在FileA1中合并的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>

非常感谢任何和所有帮助!

1 个答案:

答案 0 :(得分: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>