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

XSLT循环中Plan B表头重复输出问题的修正需求

解决XSLT 2.0分组时表头重复输出问题

问题说明

需要将XML中的<Detail>节点按<Plan>值分为两组:Plan A(Plan=N)和Plan B(Plan=Y),每组仅在首行显示对应表头,但原有<xsl:for-each>循环逻辑导致Plan B表头重复输出。

解决方案

使用XSLT 2.0的<xsl:for-each-group>分组功能,直接按<Plan>值分组,每个分组仅输出一次表头,再遍历组内节点输出数据。

输入XML示例

<Root>
  <Detail>
    <Plan>N</Plan>
    <Data>Data A1</Data>
  </Detail>
  <Detail>
    <Plan>N</Plan>
    <Data>Data A2</Data>
  </Detail>
  <Detail>
    <Plan>Y</Plan>
    <Data>Data B1</Data>
  </Detail>
  <Detail>
    <Plan>Y</Plan>
    <Data>Data B2</Data>
  </Detail>
</Root>

修正后的XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="UTF-8"/>

  <xsl:template match="/Root">
    <!-- 按Plan字段值分组 -->
    <xsl:for-each-group select="Detail" group-by="Plan">
      <!-- 输出当前分组对应的表头 -->
      <xsl:choose>
        <xsl:when test="current-grouping-key()='N'">
          <xsl:text>=== Plan A 表头 ===&#10;</xsl:text>
        </xsl:when>
        <xsl:when test="current-grouping-key()='Y'">
          <xsl:text>=== Plan B 表头 ===&#10;</xsl:text>
        </xsl:when>
      </xsl:choose>
      <!-- 遍历当前分组内的所有Detail节点 -->
      <xsl:for-each select="current-group()">
        <xsl:value-of select="Data"/>
        <xsl:text>&#10;</xsl:text>
      </xsl:for-each>
      <!-- 组间添加空行分隔(可选) -->
      <xsl:text>&#10;</xsl:text>
    </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>

期望输出

=== Plan A 表头 ===
Data A1
Data A2

=== Plan B 表头 ===
Data B1
Data B2

方案说明

  • <xsl:for-each-group>会将所有<Detail>节点按Plan值聚合为独立分组,每个分组仅执行一次表头输出逻辑,彻底避免重复。
  • current-grouping-key()用于获取当前分组的Plan值,以此判断输出哪个表头。
  • current-group()返回当前分组内的所有<Detail>节点,遍历即可输出组内数据。

内容的提问来源于stack exchange,提问作者User501

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:37:13