问题描述
|
我知道这可能很简单,但是我尝试了很多类似的问题来寻找答案。使用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,@DateOfService)
)
[1]
)
]
\">
<xsl:copy>
<xsl:copy-of select=\"@*\"/>
<xsl:variable name=\"vGroup\" select=
\"key(\'kCLMByAttribs\',@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\"
,这就是我假设您想要的。