2013-06-04 2 views
0

Я пытаюсь объединить два xml-файла с обновлениями на основе условности. В первом файле вы заметите, что есть 3 последовательности SECTION_SUMMARY. Третья последовательность имеет LockAuthority Attri bute от «1».Объединить 2 xml-файла с xslt и условиями

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, то значение происходит из значения File2 else из File1. Я также хочу, чтобы любые точки данных с LockAuthority не были объединены в File1. Если LockAuthority отсутствует, данные из файла 2 будут преобладать.

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:).

<?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

Смежные вопросы