XSLT 2.0 如何对每个唯一项目 id 的计数求和
Posted
技术标签:
【中文标题】XSLT 2.0 如何对每个唯一项目 id 的计数求和【英文标题】:XSLT 2.0 How do I Sum total of count for each unique item id 【发布时间】:2021-01-02 20:25:57 【问题描述】:请注意,某些 id 重复,我只想要每个唯一 id 的计数总和。正确的总数是 11。
注意:我必须将第一组的 id 编辑为 1
示例输入文件:
<?xml version="1.0" encoding="UTF-8"?>
<file>
<item>
<id>1</id>
<count>4</count>
</item>
<item>
<id>2</id>
<count>7</count>
</item>
<item>
<id>2</id>
<count>7</count>
</item>
<item>
<id>2</id>
<count>7</count>
</item>
</file>
示例输出文件:
<?xml version="1.0" encoding="UTF-8"?>
<output>
<totalUniqueItemCount>11</totalUniqueItemCount>
</output>
XSLT 尝试:
在这里您可以看到我正在尝试使用 for-each 组,但它对我不起作用。我需要能够得到这些计数的总和,但我不知道如何围绕每个组的输出来对计数求和。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="/file">
<output>
<totalUniqueItemCount>
<xsl:for-each-group select="item" group-by="id">
<xsl:value-of select="xs:integer(count)"/>
</xsl:for-each-group>
</totalUniqueItemCount>
</output>
</xsl:template>
</xsl:stylesheet>
我也尝试过这种方法,但没有成功:
<xsl:output indent="yes" method="xml"/>
<xsl:template match="/file">
<output>
<totalUniqueItemCount>
<xsl:value-of select="sum(item[id ne following-sibling::id]/count)"/>
</totalUniqueItemCount>
</output>
</xsl:template>
样式表>
【问题讨论】:
【参考方案1】:<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes" method="xml"/>
<xsl:key name="itemById" match="file/item" use="id"/>
<xsl:template match="/file">
<output>
<totalUniqueItemCount>
<xsl:value-of select="sum(//item[generate-id(.) = generate-id(key('itemById',id)[1])]/count)"/>
</totalUniqueItemCount>
</output>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/3Mvnt44/1
【讨论】:
感谢大家的帮助。 @MatinM 您的解决方案看起来最好。谢谢你。我很感谢你们。【参考方案2】:您的第二个代码只需稍作改动
使用
<xsl:value-of select="sum(item[not(id = following-sibling::item/id)]/count)"/>
而不是
<xsl:value-of select="sum(item[id ne following-sibling::id]/count)"/>
【讨论】:
不是一个好方法 - 在这里查看原因:jenitennison.com/xslt/grouping/muenchian.html【参考方案3】:如何围绕每个组的输出来对计数求和。
你本来可以做到的:
<xsl:template match="/file">
<xsl:variable name="unique-counts">
<xsl:for-each-group select="item" group-by="id">
<xsl:copy-of select="count"/>
</xsl:for-each-group>
</xsl:variable>
<output>
<totalUniqueItemCount>
<xsl:value-of select="sum($unique-counts/count)"/>
</totalUniqueItemCount>
</output>
</xsl:template>
但 MartinM 建议的方法可能更适合这种情况。
【讨论】:
以上是关于XSLT 2.0 如何对每个唯一项目 id 的计数求和的主要内容,如果未能解决你的问题,请参考以下文章
当输入文件上的字段为空时,XSLT 2.0 如何跳过写入元素