【问题标题】:Merge 2 xml files with xslt and conditionality使用 xslt 和条件合并 2 个 xml 文件
【发布时间】:2013-06-04 19:53:10
【问题描述】:

我正在尝试将两个 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 具有值为“2”的 LockAuthority 属性。如果该值大于或等于 File 1 中的 value,则 value 来自 File2,否则 value 来自 File1。我还想要合并 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>

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

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案1】:

    这里是简单的解决方案(可以通过使用 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>
    

    【讨论】:

    • 我将第 5 行的文件名更改为我的文件名并运行它。我只得到了 File1 中的数据。我错过了什么吗?
    • 应该可以。 (我用 xsltproc 测试过) XML 文件和 xslt 是否在同一个目录中?您是否使用已发布的 xml 文件进行测试?也许您的测试中涉及命名空间(因为 xlink:label)?
    • 文件都在同一个目录下。将您的答案复制到新文件并保存到同一目录。将新的 xslt 分配给 File1 并执行 XSL 转换。我正在使用 XMLSpy。也尝试删除标签。我正在使用我发布的相同文件。还有什么建议吗?
    • 这似乎是一个 XMLSpy 问题。这实际上适用于不同的浏览器 FireFox、Chrome、IE。
    • 我正在尝试访问另一个工具。可能是 Stylus Studio 2007。希望这会奏效。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多