Группировка в узле с 3 атрибутами в xslt 1.0 - PullRequest
1 голос
/ 24 апреля 2011

Мне нужна помощь относительно группировки узлов в xslt 1.0. Я могу это сделать в xslt 2.0 для каждой группы, но я не знаю, как это сделать в 1.0. Ниже показан пример xml, в котором я хочу сгруппировать узел 'CLM', используя комбинацию ServiceId, WorkerId и Date of service для атрибута 'ClaimId' и суммы 'Units'. Если служба, предоставляемая в один и тот же день одним и тем же работником более одного раза, объединяет эти узлы CLM.

<?xml version="1.0" encoding="UTF-8"?>
<PRV ProviderId="100" PName="Giga health" Provsuv="1563">
    <CLT ClientId="4444" ClientFName="John" ClientLastName="Pulaski" Phone="56462561">
        <CLM Claimid="1"  DateOfService="01/02/2011" EndOfService="05/05/2011" ServiceId="S1" WorkerName="WORK1" WorkerId="6446" Unit= '5' Amount= '5000'/>
        <CLM Claimid="2"  DateOfService="01/02/2011" EndOfService="05/05/2011" ServiceId="S1" WorkerName="WORK1" WorkerId="6446" Unit= '6' Amount= '5000'/>
        <CLM Claimid="3"  DateOfService="01/02/2011" EndOfService="05/05/2011" ServiceId="S2" WorkerName="WORK1" WorkerId="2006" Unit= '7' Amount= '5000'/>
        <CLM Claimid="4"  DateOfService="01/03/2011" EndOfService="05/05/2011" ServiceId="S1" WorkerName="WOK2" WorkerId="6446" Unit= '3' Amount= '5000'/>
        <CLM Claimid="5"  DateOfService="01/03/2011" EndOfService="05/05/2011" ServiceId="S2" WorkerName="WORK2" WorkerId="6446" Unit= '8' Amount= '5000'/>
        <CLM Claimid="6" DateOfService="01/03/2011" EndOfService="05/05/2011" ServiceId="S2" WorkerName="WORK1" WorkerId="6446" Unit= '1' Amount= '5000'/>
    </CLT>

Мой вывод должен выглядеть как

<?xml version="1.0" encoding="UTF-8"?>
<PRV ProviderId="100" PName="Giga health" Provsuv="1563">
    <CLT ClientId="4444" ClientFName="John" ClientLastName="Pulaski" Phone="56462561">
        <CLM Claimid="1,2"  DateOfService="01/02/2011" EndOfService="05/05/2011" ServiceId="S1" WorkerName="WORK1" WorkerId="6446" Unit= '11' Amount= '10000'/>
        <CLM Claimid="3"  DateOfService="01/02/2011" EndOfService="05/05/2011" ServiceId="S2" WorkerName="WORK1" WorkerId="2006" Unit= '7' Amount= '5000'/>
        <CLM Claimid="4"  DateOfService="01/03/2011" EndOfService="05/05/2011" ServiceId="S1" WorkerName="WOK2" WorkerId="6446" Unit= '3' Amount= '5000'/>
        <CLM Claimid="5,6"  DateOfService="01/03/2011" EndOfService="05/05/2011" ServiceId="S2" WorkerName="WORK2" WorkerId="6446" Unit= '9' Amount= '10000'/>
    </CLT>

В моем выходном xml должен быть объединен «Claimid», а единицы должны быть суммированы для одного и того же идентификатора службы в том же DateofService для определенного «идентификатора работника». Заранее спасибо.

1 Ответ

0 голосов
/ 24 апреля 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kCLMByAttribs" match="CLM" use=
 "concat(@ServiceId,'+',@WorkerId,'+',@DateOfService)"/>

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

 <xsl:template match=
 "CLM[generate-id()
     =
      generate-id(key('kCLMByAttribs',
                      concat(@ServiceId,
                            '+',@WorkerId,
                            '+',@DateOfService)
                     )
                     [1]
                 )
     ]
 ">
  <xsl:copy>
   <xsl:copy-of select="@*"/>

   <xsl:variable name="vGroup" select=
   "key('kCLMByAttribs',
         concat(@ServiceId,
                '+',@WorkerId,
                '+',@DateOfService)
       )
   "/>

   <xsl:variable name="vClaimIds">
    <xsl:for-each select="$vGroup">
      <xsl:if test="not(position()=1)">
       <xsl:value-of select="','"/>
      </xsl:if>
      <xsl:value-of select="@Claimid"/>
    </xsl:for-each>
   </xsl:variable>

   <xsl:attribute name="Claimid">
    <xsl:value-of select="$vClaimIds"/>
   </xsl:attribute>

   <xsl:attribute name="Unit">
    <xsl:value-of select="sum($vGroup/@Unit)"/>
   </xsl:attribute>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="CLM"/>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<PRV ProviderId="100" PName="Giga health"
Provsuv="1563">
    <CLT ClientId="4444" ClientFName="John"
      ClientLastName="Pulaski" Phone="56462561">
        <CLM Claimid="1"  DateOfService="01/02/2011"
          EndOfService="05/05/2011" ServiceId="S1"
          WorkerName="WORK1" WorkerId="6446"
          Unit= '5' Amount= '5000'/>
        <CLM Claimid="2"  DateOfService="01/02/2011"
         EndOfService="05/05/2011" ServiceId="S1"
         WorkerName="WORK1" WorkerId="6446"
         Unit= '6' Amount= '5000'/>
        <CLM Claimid="3"  DateOfService="01/02/2011"
         EndOfService="05/05/2011" ServiceId="S2"
         WorkerName="WORK1" WorkerId="2006"
         Unit= '7' Amount= '5000'/>
        <CLM Claimid="4"  DateOfService="01/03/2011"
         EndOfService="05/05/2011" ServiceId="S1"
         WorkerName="WOK2" WorkerId="6446"
         Unit= '3' Amount= '5000'/>
        <CLM Claimid="5"  DateOfService="01/03/2011"
         EndOfService="05/05/2011" ServiceId="S2"
         WorkerName="WORK2" WorkerId="6446"
         Unit= '8' Amount= '5000'/>
        <CLM Claimid="6" DateOfService="01/03/2011"
         EndOfService="05/05/2011" ServiceId="S2"
         WorkerName="WORK1" WorkerId="6446"
         Unit= '1' Amount= '5000'/>
    </CLT>
</PRV>

дает именно нужный, правильный результат :

<PRV ProviderId="100" PName="Giga health" Provsuv="1563">
   <CLT ClientId="4444" ClientFName="John"
        ClientLastName="Pulaski" Phone="56462561">
      <CLM Claimid="1,2" DateOfService="01/02/2011"
       EndOfService="05/05/2011" ServiceId="S1"
       WorkerName="WORK1" WorkerId="6446"
       Unit="11" Amount="5000"/>
      <CLM Claimid="3" DateOfService="01/02/2011"
       EndOfService="05/05/2011" ServiceId="S2"
       WorkerName="WORK1" WorkerId="2006"
       Unit="7" Amount="5000"/>
      <CLM Claimid="4" DateOfService="01/03/2011"
       EndOfService="05/05/2011" ServiceId="S1"
       WorkerName="WOK2" WorkerId="6446"
       Unit="3" Amount="5000"/>
      <CLM Claimid="5,6" DateOfService="01/03/2011"
       EndOfService="05/05/2011" ServiceId="S2"
       WorkerName="WORK2" WorkerId="6446"
       Unit="9" Amount="5000"/>
   </CLT>
</PRV>

Объяснение

Мюнхенская группировка с ключом, представляющим собой конкатенацию трех частей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...