我正在尝试将两个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>
非常感谢任何和所有帮助!
答案 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>