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

XSLT实现TratEqnt节点按块拆分并保留子节点的问题排查

解决TratEqnt节点按Sl数量分组拆分的XSLT方案

核心需求

当TratEqnt节点下的Sl子节点数量超过4时,将Sl按每4个为一组拆分到新的TratEqnt节点中,每个新节点必须保留原节点的所有非Sl子节点(如sqNumberFinal、numberOfSls等)。

输入输出示例

输入XML

<Root>
  <TratEqnt>
    <sqNumberFinal>TE001</sqNumberFinal>
    <numberOfSls>6</numberOfSls>
    <Sl>SL001</Sl>
    <Sl>SL002</Sl>
    <Sl>SL003</Sl>
    <Sl>SL004</Sl>
    <Sl>SL005</Sl>
    <Sl>SL006</Sl>
    <OtherNode>TestContent</OtherNode>
  </TratEqnt>
  <TratEqnt>
    <sqNumberFinal>TE002</sqNumberFinal>
    <numberOfSls>3</numberOfSls>
    <Sl>SL007</Sl>
    <Sl>SL008</Sl>
    <Sl>SL009</Sl>
  </TratEqnt>
</Root>

期望输出XML

<Root>
  <TratEqnt>
    <sqNumberFinal>TE001</sqNumberFinal>
    <numberOfSls>6</numberOfSls>
    <OtherNode>TestContent</OtherNode>
    <Sl>SL001</Sl>
    <Sl>SL002</Sl>
    <Sl>SL003</Sl>
    <Sl>SL004</Sl>
  </TratEqnt>
  <TratEqnt>
    <sqNumberFinal>TE001</sqNumberFinal>
    <numberOfSls>6</numberOfSls>
    <OtherNode>TestContent</OtherNode>
    <Sl>SL005</Sl>
    <Sl>SL006</Sl>
  </TratEqnt>
  <TratEqnt>
    <sqNumberFinal>TE002</sqNumberFinal>
    <numberOfSls>3</numberOfSls>
    <Sl>SL007</Sl>
    <Sl>SL008</Sl>
    <Sl>SL009</Sl>
  </TratEqnt>
</Root>

修复后的XSLT代码

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

  <!-- 匹配根节点,直接处理子节点 -->
  <xsl:template match="Root">
    <xsl:copy>
      <xsl:apply-templates select="TratEqnt"/>
    </xsl:copy>
  </xsl:template>

  <!-- 处理每个TratEqnt节点 -->
  <xsl:template match="TratEqnt">
    <!-- 按每4个Sl节点分组 -->
    <xsl:for-each-group select="Sl" group-adjacent="(position() - 1) idiv 4">
      <!-- 生成新的TratEqnt节点 -->
      <TratEqnt>
        <!-- 复制原节点中所有非Sl的子节点 -->
        <xsl:copy-of select="../*[not(self::Sl)]"/>
        <!-- 复制当前组内的所有Sl节点 -->
        <xsl:copy-of select="current-group()"/>
      </TratEqnt>
    </xsl:for-each-group>
  </xsl:template>

  <!-- 默认模板,复制其他节点结构 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

关键逻辑说明

  1. 分组逻辑:使用group-adjacent="(position() - 1) idiv 4"对Sl节点按位置分组,每4个为一组。(position()-1) idiv 4会为第1-4个Sl生成0,第5-8个生成1,以此类推,保证分组顺序正确。
  2. 复制非Sl节点:通过../*[not(self::Sl)]获取原TratEqnt下所有非Sl子节点并复制到新节点中,确保原有属性和其他节点不丢失。
  3. 兼容边界场景:当Sl数量≤4时,只会生成一个TratEqnt节点,符合需求。

原代码常见问题排查

如果原代码无法正常工作,通常是以下原因:

  • 未正确使用group-adjacent分组,误用group-by导致分组顺序混乱。
  • 复制非Sl节点时路径错误,未准确定位到原TratEqnt节点的同级非Sl元素。
  • 未处理Sl数量≤4的边界场景,导致节点丢失或重复生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:15:34