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
相关产品推荐
相关产品推荐

