【发布时间】:2021-09-13 15:03:29
【问题描述】:
我有一个非常相似的问题:Need XSLT transform to remove duplicate elements - sorted by an attribute。我从 最佳答案 中获取了解决方案并稍作修改。我必须计算状态,但只考虑最新结果。
我的模板如下所示:
<xsl:template match='Results/Result' mode='countstatus'>
<xsl:param name='status' select='"Pass"'/>
<xsl:for-each select="key('sn-key', SerialNumber)">
<xsl:sort select='./Date' order='descending'/>
<xsl:if test='((position() = 1) and (./Status=$status))'>
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:template>
我不想显示所有匹配的结果,而只想显示应用此模板后返回的项目数。
我的键定义是<xsl:key name='sn-key' match='Results/Result' use='SerialNumber'/>,我将此模板称为<xsl:apply-templates select='Results/Result[generate-id() = generate-id(key("sn-key", SerialNumber)[1])]' mode='countstatus'/>。
编辑
头脑清醒,我发现我的问题有点不清楚。这里有更多细节。
我的输入如下所示:
<Results>
<Result ID="0">
<SerialNumber>3333</SerialNumber>
<Status>Fail</Status>
<Date>21</Date>
</Result>
<Result ID="1">
<SerialNumber>1111</SerialNumber>
<Status>Fail</Status>
<Date>34</Date>
</Result>
<Result ID="2">
<SerialNumber>1111</SerialNumber>
<Status>Pass</Status>
<Date>67</Date>
</Result>
<Result ID="3">
<SerialNumber>2222</SerialNumber>
<Status>Fail</Status>
<Date>40</Date>
</Result>
<Result ID="4">
<SerialNumber>1111</SerialNumber>
<Status>Fail</Status>
<Date>55</Date>
</Result>
<Result ID="5">
<SerialNumber>1111</SerialNumber>
<Status>Fail</Status>
<Date>88</Date>
</Result>
<Result ID="6">
<SerialNumber>2222</SerialNumber>
<Status>Fail</Status>
<Date>22</Date>
</Result>
<Result ID="7">
<SerialNumber>1111</SerialNumber>
<Status>Fail</Status>
<Date>86</Date>
</Result>
<Result ID="8">
<SerialNumber>3333</SerialNumber>
<Status>Pass</Status>
<Date>99</Date>
</Result>
</Results>
我想数一下,例如Fail 状态出现多少次,但只考虑 SerialNumber 的最新结果。我之前展示的模板显示了SerialNumber 的所有最新结果(但状态为Pass)。我想只显示数字。例如,在查找失败次数时,我想显示 2 而不是 [1111 Fail 88, 2222 Fail 40]。
我的转变现在看起来像这样(但我需要别的东西):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name='sn-key' match='Results/Result' use='SerialNumber' />
<xsl:template match="/">
<xsl:apply-templates select="Results/Result[generate-id()=generate-id(key('sn-key', SerialNumber)[1])]"/>
</xsl:template>
<xsl:template match="Results/Result">
<xsl:param name='status' select='"Fail"'/>
<xsl:for-each select="key('sn-key', SerialNumber)">
<xsl:sort select="./Date" order="descending"/>
<xsl:if test='((position() = 1) and (./Status=$status))'>
<xsl:value-of select="."/><br />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
标签: xml xslt counting muenchian-grouping