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

XSLT 2.0转换XML未按预期生成Batch分组结构问题求解

问题根因

现有XSLT仅实现了逐test节点的单类型转换逻辑,未对「Header起始、Control结尾」的连续同批次节点做分组包裹,因此无法生成<Batch>层级结构。

修正方案

XSLT 2.0原生支持for-each-group分组语法,直接以C2值为H的节点作为分组起始标记,自动识别每组到下一个H节点前的所有节点(天然以T节点作为组结尾),每组外层包裹<Batch>节点即可。

完整修正后XSLT代码

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template match="/Root-Element">
    <Details>
      <!-- 筛选有效节点,按H节点作为批次起始分组 -->
      <xsl:for-each-group select="test[contains(C1,'00000')]" 
                          group-starting-with="test[contains(C2,'H')]">
        <Batch>
          <xsl:apply-templates select="current-group()"/>
        </Batch>
      </xsl:for-each-group>
    </Details>
  </xsl:template>

  <xsl:template match="test[contains(C2,'H')]">
    <Header>
      <xsl:apply-templates/>
    </Header>
  </xsl:template>

  <xsl:template match="test[contains(C2,'D')]">
    <Details>
      <xsl:apply-templates/>
    </Details>
  </xsl:template>

  <xsl:template match="test[contains(C2,'T')]">
    <Control>
      <xsl:apply-templates/>
    </Control>
  </xsl:template>

  <!-- 丢弃不符合转换规则的无效test节点 -->
  <xsl:template match="test" />
</xsl:stylesheet>

逻辑说明

  • 分组阶段先过滤掉C1不包含00000的无效节点,避免异常数据干扰分组结果
  • 每个分组自动覆盖从当前H节点开始,到下一个H节点之前的所有连续节点,正好对应一个从Header到Control的完整批次
  • 组内节点完全复用原有编写的单节点转换规则,不需要调整已有节点的输出格式
  • 运行后输出结构和预期结果完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:06:22