You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT按CodiceAttivita分组后,如何判断分组数量大于1并显示元素?

解决XSLT分组中判断重复CodiceAttivita的问题

嘿,我来帮你搞定这个分组判断的小麻烦~首先得理清楚你原来的写法哪里出问题了,再给你正确的实现方案。

问题根源:你的表达式逻辑搞反啦

你原来写的<xsl:if test=" [count(. | key('products-by-category', CodiceAttivita)[1]) = 1] > 1">有两个明显问题:

  1. 多余的方括号属于语法错误,会导致表达式无法正确解析;
  2. 核心逻辑偏离需求:count(. | key('products-by-category', CodiceAttivita)[1]) = 1这个表达式是用来判断当前节点是不是对应分组的第一个节点(当当前节点是分组首节点时,和首节点的并集count为1;否则为2)。你把这个判断结果再和1比较,完全搞错了“判断分组总数量是否大于1”的目标。

正确实现步骤

首先确保你已经正确定义了分组的key(如果还没定义的话):

<xsl:key name="products-by-category" match="Riepilogo" use="CodiceAttivita"/>

接下来按照以下逻辑处理:

  1. 先定位每个CodiceAttivita分组的第一个节点(避免重复处理同一个分组);
  2. 对每个分组的首节点,计算该分组下所有Riepilogo的数量,判断是否大于1;
  3. 满足条件时输出指定元素块。

完整代码示例

<!-- 主模板:遍历每个分组的首节点 -->
<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:22:53