如何使用XSL计算元素值的出现次数



我正在尝试用xsl计算不同节点值的出现次数。下面是一个xml示例:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<data>
<hit><date>2021-03-23</date><time>04:13:01 pm</time><type>viewed</type><info>twitter</info></hit>
<hit><date>2021-03-23</date><time>05:01:49 pm</time><type>conversion</type><info>instagram</info></hit>
<hit><date>2021-04-06</date><time>08:03:09 am</time><type>viewed</type><info>youtube</info></hit>
<hit><date>2021-04-07</date><time>07:27:41 pm</time><type>viewed</type><info>youtube</info></hit>
<hit><date>2021-04-07</date><time>10:32:45 pm</time><type>viewed</type><info>youtube</info></hit>
</data>

我想要一个沿着2021-03-23=22021-04-06=12021-04-07=2的输出,计算数据/命中/日期中值的出现次数。

此外,按类型区分也很好。例如:2021-03-23=2次点击,1次观看,1次转化。

谢谢你的帮助。

这似乎是一个分组问题。您没有指定使用的XSLT版本,也没有发布您尝试过的示例。

在XSLT2.0+中,使用xsl:for-each分组要容易得多。XSLT1.0中的分组是使用Muenchian方法完成的。

我将使用最坏的情况,并假设XSLT1.0。看看上面的链接来了解Muenchian分组,这样我的例子就有意义了。

我要做的是创建一个密钥,按其date子元素对所有hit元素进行分组。我将创建另一个密钥,通过datetype元素的组合来对hit元素进行分组。

然后,您可以使用这些键进行分组和计数。。。

XML输入

<data>
<hit><date>2021-03-23</date><time>04:13:01 pm</time><type>viewed</type><info>twitter</info></hit>
<hit><date>2021-03-23</date><time>05:01:49 pm</time><type>conversion</type><info>instagram</info></hit>
<hit><date>2021-04-06</date><time>08:03:09 am</time><type>viewed</type><info>youtube</info></hit>
<hit><date>2021-04-07</date><time>07:27:41 pm</time><type>viewed</type><info>youtube</info></hit>
<hit><date>2021-04-07</date><time>10:32:45 pm</time><type>viewed</type><info>youtube</info></hit>
</data>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:key name="hit-by-date" match="hit" use="date"/>
<xsl:key name="hit-by-date-type" match="hit" use="concat(date,'~',type)"/>

<xsl:template match="/*">
<xsl:for-each select="hit[count(.|key('hit-by-date',date)[1])=1]">
<xsl:value-of select="concat(date,' = ',count(key('hit-by-date',date)),' hits')"/>
<xsl:for-each select="key('hit-by-date',date)[count(.|key('hit-by-date-type',concat(date,'~',type))[1])=1]">
<xsl:value-of select="concat(', ', count(key('hit-by-date-type',concat(date,'~',type))),' ',type)"/>
</xsl:for-each>
<xsl:text>&#xA;</xsl:text>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

XML输出

2021-03-23 = 2 hits, 1 viewed, 1 conversion
2021-04-06 = 1 hits, 1 viewed
2021-04-07 = 2 hits, 2 viewed

Fiddle:http://xsltfiddle.liberty-development.net/nb9PtEu

最新更新