XSLT按CodiceAttivita分组后,如何判断分组数量大于1并显示元素?
解决XSLT分组中判断重复CodiceAttivita的问题
嘿,我来帮你搞定这个分组判断的小麻烦~首先得理清楚你原来的写法哪里出问题了,再给你正确的实现方案。
问题根源:你的表达式逻辑搞反啦
你原来写的<xsl:if test=" [count(. | key('products-by-category', CodiceAttivita)[1]) = 1] > 1">有两个明显问题:
- 多余的方括号属于语法错误,会导致表达式无法正确解析;
- 核心逻辑偏离需求:
count(. | key('products-by-category', CodiceAttivita)[1]) = 1这个表达式是用来判断当前节点是不是对应分组的第一个节点(当当前节点是分组首节点时,和首节点的并集count为1;否则为2)。你把这个判断结果再和1比较,完全搞错了“判断分组总数量是否大于1”的目标。
正确实现步骤
首先确保你已经正确定义了分组的key(如果还没定义的话):
<xsl:key name="products-by-category" match="Riepilogo" use="CodiceAttivita"/>
接下来按照以下逻辑处理:
- 先定位每个
CodiceAttivita分组的第一个节点(避免重复处理同一个分组); - 对每个分组的首节点,计算该分组下所有
Riepilogo的数量,判断是否大于1; - 满足条件时输出指定元素块。
完整代码示例
<!-- 主模板:遍历每个分组的首节点 --> <xsl:template match="/"> <xsl:apply-templates select="Riepilogo[count(. | key('products-by-category', CodiceAttivita)[1]) = 1]"/> </xsl:template> <!-- 处理分组首节点的模板 --> <xsl:template match="Riepilogo"> <!-- 判断当前分组的总条目数是否大于1 --> <xsl:if test="count(key('products-by-category', CodiceAttivita)) > 1"> <!-- 这里替换成你要显示的指定元素块 --> <div class="duplicate-category"> <h3>重复的CodiceAttivita:<xsl:value-of select="CodiceAttivita"/></h3> <p>该分类下共有 <xsl:value-of select="count(key('products-by-category', CodiceAttivita))"/> 条记录:</p> <ul> <!-- 遍历输出分组内的所有记录 --> <xsl:for-each select="key('products-by-category', CodiceAttivita)"> <li> 金额:<xsl:value-of select="Ammontare"/> | IVA税率:<xsl:value-of select="IVA/AliquotaIVA"/>% </li> </xsl:for-each> </ul> </div> </xsl:if> </xsl:template>
针对你的XML示例的效果
你的XML里CodiceAttivita=253000有2条Riepilogo,会触发输出;而CodiceAttivita=433100只有1条,不会显示任何内容。
内容的提问来源于stack exchange,提问作者Luca Cerato
相关产品推荐
相关产品推荐

