2016-11-16 60 views
0

如何合併重複節點,在比較中使用子項?

<?xml version="1.0" encoding="utf-8"?> 
 
<?xml-stylesheet type="text/xsl" href="Test1.xsl"?> 
 
<root> 
 

 
    <RemittanceInformation> 
 
    <EntityAssignedNumber>25</EntityAssignedNumber> 
 
    <IndividualRemittance> 
 
     <IndividualName> 
 
     <LastName>Johnson</LastName> 
 
     <FirstName>Steve</FirstName> 
 
     <ExchangeAssignedSubscriberID>6650442525</ExchangeAssignedSubscriberID> 
 
     </IndividualName> 
 
     <ExchangeAssignedQHPID>38408SC221000101</ExchangeAssignedQHPID> 
 
     <ExchangeAssignedPolicyID>26141334</ExchangeAssignedPolicyID> 
 
     <IssuerAssignedPolicyID>39147964</IssuerAssignedPolicyID> 
 
     <IssuerAssignedSubscriberID>101009913000</IssuerAssignedSubscriberID> 
 
    </IndividualRemittance> 
 
    <RemittanceDetail> 
 
     <ExchangePaymentCode>APTC</ExchangePaymentCode> 
 
     <PaymentAmount>214.00</PaymentAmount> 
 
     <PaymentCoverageStartDate>2016-10-01</PaymentCoverageStartDate> 
 
     <PaymentCoverageEndDate>2016-10-31</PaymentCoverageEndDate> 
 
    </RemittanceDetail> 
 
    <RemittanceDetail> 
 
     <ExchangePaymentCode>UF</ExchangePaymentCode> 
 
     <PaymentAmount>-43.04</PaymentAmount> 
 
     <PaymentCoverageStartDate>2016-10-01</PaymentCoverageStartDate> 
 
     <PaymentCoverageEndDate>2016-10-31</PaymentCoverageEndDate> 
 
    </RemittanceDetail> 
 
    </RemittanceInformation> 
 

 
    <RemittanceInformation> 
 
    <EntityAssignedNumber>26</EntityAssignedNumber> 
 
    <IndividualRemittance> 
 
     <IndividualName> 
 
     <LastName>Johnson</LastName> 
 
     <FirstName>Steve</FirstName> 
 
     <ExchangeAssignedSubscriberID>0000442525</ExchangeAssignedSubscriberID> 
 
     </IndividualName> 
 
     <ExchangeAssignedQHPID>38408SC001000101</ExchangeAssignedQHPID> 
 
     <ExchangeAssignedPolicyID>26141334</ExchangeAssignedPolicyID> 
 
     <IssuerAssignedPolicyID>39147964</IssuerAssignedPolicyID> 
 
     <IssuerAssignedSubscriberID>101009913000</IssuerAssignedSubscriberID> 
 
    </IndividualRemittance> 
 
    <RemittanceDetail> 
 
     <ExchangePaymentCode>APTC</ExchangePaymentCode> 
 
     <PaymentAmount>556.00</PaymentAmount> 
 
     <PaymentCoverageStartDate>2016-10-01</PaymentCoverageStartDate> 
 
     <PaymentCoverageEndDate>2016-10-31</PaymentCoverageEndDate> 
 
    </RemittanceDetail> 
 
    <RemittanceDetail> 
 
     <ExchangePaymentCode>UF</ExchangePaymentCode> 
 
     <PaymentAmount>-30.50</PaymentAmount> 
 
     <PaymentCoverageStartDate>2016-10-01</PaymentCoverageStartDate> 
 
     <PaymentCoverageEndDate>2016-10-31</PaymentCoverageEndDate> 
 
    </RemittanceDetail> 
 
    </RemittanceInformation> 
 

 
    <RemittanceInformation> 
 
    <EntityAssignedNumber>27</EntityAssignedNumber> 
 
    <IndividualRemittance> 
 
     <IndividualName> 
 
     <LastName>Masterson</LastName> 
 
     <FirstName>Gene</FirstName> 
 
     <MiddleName>E</MiddleName> 
 
     <ExchangeAssignedSubscriberID>0032171620</ExchangeAssignedSubscriberID> 
 
     </IndividualName> 
 
     <ExchangeAssignedQHPID>384111C001000101</ExchangeAssignedQHPID> 
 
     <ExchangeAssignedPolicyID>26523035</ExchangeAssignedPolicyID> 
 
     <IssuerAssignedPolicyID>38976623</IssuerAssignedPolicyID> 
 
     <IssuerAssignedSubscriberID>101009869500</IssuerAssignedSubscriberID> 
 
    </IndividualRemittance> 
 
    <RemittanceDetail> 
 
     <ExchangePaymentCode>APTC</ExchangePaymentCode> 
 
     <PaymentAmount>448.00</PaymentAmount> 
 
     <PaymentCoverageStartDate>2016-10-01</PaymentCoverageStartDate> 
 
     <PaymentCoverageEndDate>2016-10-31</PaymentCoverageEndDate> 
 
    </RemittanceDetail> 
 
    <RemittanceDetail> 
 
     <ExchangePaymentCode>UF</ExchangePaymentCode> 
 
     <PaymentAmount>-30.50</PaymentAmount> 
 
     <PaymentCoverageStartDate>2016-10-01</PaymentCoverageStartDate> 
 
     <PaymentCoverageEndDate>2016-10-31</PaymentCoverageEndDate> 
 
    </RemittanceDetail> 
 
    </RemittanceInformation> 
 
</root>

我有一噸數據的在上述格式的XML文件。一個人由一個「匯款信息」代表,但有一些重複。我想合併這些副本,並將所有副本中的「匯款詳細信息」實例添加到該人員的第一個實例中。一個人由「ExchangeAssignedPolicyID」編號唯一標識。

在上面的例子中,26號的兩個匯款明細節點應該被移到25號的匯款信息,因爲它們都是同一個ExchangeAssignedPolicyID的人。以下所有匯款信息節點都應遞增,以彌補缺失的數量。

我在S/O上看過類似的代碼,但經過很多小時和大量的咖啡,我無法弄清楚這一點。任何幫助將不勝感激。

+0

'是假設XSLT 2.0的開始。通過https://www.w3.org/TR/xslt20/#grouping-examples瞭解如何使用XSLT 2.0進行分組。 –

回答

1

如果您在XSLT 2.0中使用for-each-group(見https://www.w3.org/TR/xslt20/#grouping-examples例子),那麼你只需要

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="root"> 
     <xsl:copy> 
      <xsl:for-each-group select="RemittanceInformation" group-by="IndividualRemittance/ExchangeAssignedPolicyID"> 
       <xsl:copy> 
        <xsl:apply-templates select="EntityAssignedNumber, IndividualRemittance, current-group()/RemittanceDetail"/> 
       </xsl:copy> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 
</xsl:transform> 

在線http://xsltransform.net/ejivdHd

對於EntityAssignedNumber元素的適應,這裏是一些改變以實現:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="root"> 
     <xsl:copy> 
      <xsl:for-each-group select="RemittanceInformation" group-by="IndividualRemittance/ExchangeAssignedPolicyID"> 
       <xsl:copy> 
        <xsl:variable name="pos" select="position()"/> 
        <xsl:apply-templates select="EntityAssignedNumber, IndividualRemittance, current-group()/RemittanceDetail"> 
         <xsl:with-param name="pos" select="$pos"/> 
        </xsl:apply-templates> 
       </xsl:copy> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="EntityAssignedNumber"> 
     <xsl:param name="pos"/> 
     <xsl:copy> 
      <xsl:value-of select="/root/RemittanceInformation[1]/EntityAssignedNumber + $pos - 1"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:transform> 

在線http://xsltransform.net/ejivdHd/1

+0

我實際上已經寫了完全相同的代碼,從另一個問題(雖然我使用樣式表而不是變換)回答了一個答案,但是我總是收到亂碼,好像它完全不工作: http://prntscr.com/d7yjn1 –

+0

我也在使用Saxon9he和以下命令:java -jar saxon9he.jar -xsl:Test1.xsl -s:originalxml.xml -o:TestOutput.html 此外,這不會將數字向下移動,我剩下25和27. –

+0

回想起來,這似乎是一個完全不同的問題。正如在線轉換工具所顯示的,您的答案似乎很完美。謝謝:D –