2013-06-04 90 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