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

XSLT 2.0:基于条件分组并复制节点的问题求助

修正后的XSLT解决方案

核心处理逻辑

针对需求,核心要解决三个关键点:

  • 提取所有唯一<Date>值作为分组维度,每个日期对应一个独立的<Records>节点
  • 预存所有不含<Date>的<Worker>节点,确保它们被复制到每一个<Records>中
  • 直接复制同日期的<Worker>节点,避免多余的嵌套层级

XSLT 2.0+ 版本(推荐)

如果你的XSLT处理器支持2.0及以上版本,用以下代码可简洁实现需求:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <!-- 预存所有无Date的Worker节点 -->
  <xsl:variable name="date-less-workers" select="/Root/Worker[not(Date)]"/>

  <!-- 获取所有唯一的Date文本值 -->
  <xsl:variable name="unique-dates" select="distinct-values(/Root/Worker[Date]/Date/text())"/>

  <xsl:template match="/">
    <Root>
      <!-- 遍历每个唯一日期,生成对应Records -->
      <xsl:for-each select="$unique-dates">
        <xsl:variable name="current-date" select="."/>
        <Records>
          <!-- 插入无Date的Worker -->
          <xsl:copy-of select="$date-less-workers"/>
          <!-- 插入当前日期对应的Worker,直接复制原节点避免嵌套 -->
          <xsl:copy-of select="/Root/Worker[Date/text() = $current-date]"/>
        </Records>
      </xsl:for-each>
    </Root>
  </xsl:template>
</xsl:stylesheet>

XSLT 1.0 版本(兼容旧处理器)

如果只能使用XSLT 1.0,采用Muenchian分组实现:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <!-- 定义分组键:以Date文本值为分组依据 -->
  <xsl:key name="date-group" match="Worker[Date]" use="Date"/>

  <!-- 预存无Date的Worker节点 -->
  <xsl:variable name="date-less-workers" select="/Root/Worker[not(Date)]"/>

  <xsl:template match="/">
    <Root>
      <!-- 遍历每个分组的首个节点,确保每个日期只生成一个Records -->
      <xsl:for-each select="/Root/Worker[Date][generate-id() = generate-id(key('date-group', Date)[1])]">
        <Records>
          <!-- 插入无Date的Worker -->
          <xsl:copy-of select="$date-less-workers"/>
          <!-- 复制当前分组下的所有Worker节点 -->
          <xsl:copy-of select="key('date-group', Date)"/>
        </Records>
      </xsl:for-each>
    </Root>
  </xsl:template>
</xsl:stylesheet>

关键修正说明

  1. 解决多余嵌套问题:用<xsl:copy-of>直接复制原<Worker>节点,替代原代码中可能存在的手动包裹<Worker>标签的逻辑,避免带Date的节点被额外嵌套。
  2. 生成多Records节点:通过提取唯一日期值(XSLT2.0用distinct-values,XSLT1.0用Muenchian分组),确保每个日期对应一个独立的<Records>。
  3. 重复无Date节点:预存无Date的Worker节点,在每个<Records>中直接复制,满足重复显示的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:17:35