2016-11-16 7 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ファイル内のデータのトンを持っています。 1人の人物が1つの「送金情報(RemittanceInformation)」で表されますが、いくつかの重複があります。これらの重複をマージして、すべての重複の「RemittanceDetail」インスタンスをその人の最初のインスタンスに追加したいと思います。人は "ExchangeAssignedPolicyID"番号によって一意に識別されます。

上記の例では、番号26の2つのRemittanceDetailノードは、同じExchangeAssignedPolicyIDを持つ同じ人物であるため、25のRemittanceInformationに移動する必要があります。欠落した番号を補うために、次のすべてのRemittanceInformationノードを増分する必要があります。

私はS/Oで同様のコードを見たことがありますが、数時間と多くのコーヒーの後、私はこれを理解できません。どんな助けでも大歓迎です。

+0

'は、XSLT 2.0を前提とした開始です。 XSLT 2.0のグループ化の詳細については、https://www.w3.org/TR/xslt20/#grouping-examplesをご覧ください。 –

答えて

1

あなたは(https://www.w3.org/TR/xslt20/#grouping-examplesの例を参照してください)XSLT 2.0でfor-each-groupを使用する場合は、あなただけhttp://xsltransform.net/ejivdHdでオンライン

<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/1

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

オンライン:EntityAssignedNumber要素の適応については

は、ここでそれを達成するためにいくつかの変更です。

+0

私は実際には全く同じコードを書いていますが、別の質問から回答を適用しましたが(私は変換の代わりにスタイルシートを使用しましたが)、まったく動作していないかのように、どちらかというと途方もないことが続きます。 http://prntscr.com/d7yjn1 –

+0

また、次のコマンドでSaxon9heを使用しています。java -jar saxon9he.jar -xsl:Test1.xsl -s:originalxml.xml -o:TestOutput.html また、数字を下に移動しません私は25と27で残されています。 –

+0

振り返ってみると、これはまったく異なる質問のようです。あなたの答えは、オンライン変換ツールで示されているように完璧であるようです。ありがとう:D –

関連する問題