2016-11-16 1 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 파일 데이터의 톤이있다. 한 사람은 하나의 "송금 정보"로 대표되지만 일부 중복됩니다. 이 복제본을 병합하고 모든 복제물의 "RemittanceDetail"인스턴스를 해당 인물의 첫 번째 인스턴스에 추가하고 싶습니다. 개인은 "ExchangeAssignedPolicyID"번호로 고유하게 식별됩니다.

위의 예에서 번호 26의 두 개의 RemittanceDetail 노드는 동일한 ExchangeAssignedPolicyID를 가진 동일한 사람이므로 둘 다 25 번인 RemittanceInformation으로 이동해야합니다. 누락 된 번호를 보완하기 위해 다음의 모든 RemittanceInformation 노드를 증가시켜야합니다.

나는 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의 예 참조)은 다음 만 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 –

관련 문제