2016-11-16 2 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» однозначно идентифицируется человеком.

В приведенном выше примере два узла RemittanceDetail номера 26 должны быть перемещены в информацию о переносе номера 25, поскольку они оба являются одним и тем же лицом с тем же идентификатором ExchangeAssignedPolicyID. Все последующие узлы RemittanceInformation должны быть увеличены, чтобы восполнить недостающее число.

Я видел аналогичный код на S/O, но после многих часов и большого количества кофе я не могу понять это. Любая помощь будет оценена.

+0

'' является началом, предполагающим XSLT 2.0. Узнайте об объединении с XSLT 2.0 в https://www.w3.org/TR/xslt20/#grouping-examples. –

ответ

1

Если вы используете for-each-group в XSLT 2.0 (примеры в 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 –