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 的计数求和的主要内容,如果未能解决你的问题,请参考以下文章

查找熊猫中每个唯一 ID 的先前计数出现的总和

如何对唯一查询进行复杂计数

如何获取仅分配给一个值而没有其他值的唯一 ID 的计数?

当输入文件上的字段为空时,XSLT 2.0 如何跳过写入元素

如何使用 xslt 获取与复杂条件匹配的所有 xml 项的计数并在终止语句中使用它?

XSLT 2.0 中的日期时间格式