通过3键组合进行孟子分组

| 我知道这可能很简单,但是我尝试了很多类似的问题来寻找答案。使用3键的concat进行孟奇式分组很好,但是如果不需要对输入进行分组怎么办。我在下面提供了示例xsl。如果仅发生一次CLM节点,则运行转换时获得的输出不会创建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>
    <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\'/>
    </CLT>
</PRV>
应用于此输入的xsl
<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>
所需的输出
<PRV ProviderId=\"100\" PName=\"Giga health\" Provsuv=\"1563\">
  <CLT ClientId=\"4444\" ClientFName=\"John\" ClientLastName=\"Pulaski\" Phone=\"56462561\">
    <CLM DateOfService=\"01/02/2011\" EndOfService=\"05/05/2011\" ServiceId=\"S1\" WorkerName=\"WORK1\" WorkerId=\"6446\" Amount=\"5000\" Claimid=\"1,2\" Unit=\"16\" />
    <CLM DateOfService=\"01/02/2011\" EndOfService=\"05/05/2011\" ServiceId=\"S2\" WorkerName=\"WORK1\" WorkerId=\"2006\" Amount=\"5000\" Claimid=\"3\" Unit=\"7\" />
    <CLM DateOfService=\"01/03/2011\" EndOfService=\"05/05/2011\" ServiceId=\"S1\" WorkerName=\"WOK2\" WorkerId=\"6446\" Amount=\"5000\" Claimid=\"4\" Unit=\"3\" />
    <CLM DateOfService=\"01/03/2011\" EndOfService=\"05/05/2011\" ServiceId=\"S2\" WorkerName=\"WORK2\" WorkerId=\"6446\" Amount=\"5000\" Claimid=\"5,6\" Unit=\"9\" />
  </CLT>
  <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\'/>
  </CLT>  
</PRV>
    
已邀请:
要获得预期结果,最简单的更改就是让您的密钥包括
generate-id(..)
<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>
  <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\"/>
  </CLT>
</PRV>
请注意,这将导致第一个
CLT
节点下的第一个
CLM
节点产生
Claimid=\"1,2\"
,这就是我假设您想要的。     

要回复问题请先登录注册