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>
关键逻辑说明
- 分组逻辑:使用
group-adjacent="(position() - 1) idiv 4"对Sl节点按位置分组,每4个为一组。(position()-1) idiv 4会为第1-4个Sl生成0,第5-8个生成1,以此类推,保证分组顺序正确。 - 复制非Sl节点:通过
../*[not(self::Sl)]获取原TratEqnt下所有非Sl子节点并复制到新节点中,确保原有属性和其他节点不丢失。 - 兼容边界场景:当
Sl数量≤4时,只会生成一个TratEqnt节点,符合需求。
原代码常见问题排查
如果原代码无法正常工作,通常是以下原因:
- 未正确使用
group-adjacent分组,误用group-by导致分组顺序混乱。 - 复制非Sl节点时路径错误,未准确定位到原
TratEqnt节点的同级非Sl元素。 - 未处理
Sl数量≤4的边界场景,导致节点丢失或重复生成。
内容的提问来源于stack exchange,提问作者RamAlx
相关产品推荐
相关产品推荐

