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

XSLT循环逻辑问题排查及目标XML输出实现咨询

问题诊断与解决方案

核心问题分析

你原代码的逻辑错误在于没有区分最后一个AggregationEvent和前两个的角色差异:

  • 错误地统一遍历所有AggregationEvent,没有单独处理顶层节点(对应最后一个的parentID)
  • 前两个条目的parentLevelId没有正确关联到最后一个AggregationEvent的parentID,导致层级结构不符合要求

实现思路

按照需求拆解成两步处理:

  1. 单独提取最后一个AggregationEvent,生成第一个顶层despatchAdvice条目
  2. 遍历前两个AggregationEvent,生成下属条目,每个条目的parentLevelId绑定最后一个的parentID,并将自身的childEPCs/epc填充为serialNumber

修正后的XSLT代码

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

    <xsl:template match="/">
        <root>
            <!-- 生成第一个条目:对应最后一个AggregationEvent的parentID -->
            <despatchAdvice>
                <id>
                    <xsl:value-of select="(//AggregationEvent)[last()]/parentID"/>
                </id>
                <parentLevelId/> <!-- 顶层节点无父级 -->
                <serialNumber/>
            </despatchAdvice>

            <!-- 生成第二、三个条目:对应前两个AggregationEvent -->
            <xsl:for-each select="//AggregationEvent[position() &lt; last()]">
                <despatchAdvice>
                    <id>
                        <xsl:value-of select="parentID"/>
                    </id>
                    <parentLevelId>
                        <xsl:value-of select="(//AggregationEvent)[last()]/parentID"/>
                    </parentLevelId>
                    <serialNumber>
                        <xsl:value-of select="childEPCs/epc"/>
                    </serialNumber>
                </despatchAdvice>
            </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>

示例验证

输入XML示例

<events>
    <AggregationEvent>
        <parentID>BOX-001</parentID>
        <childEPCs>
            <epc>SN-1001</epc>
        </childEPCs>
    </AggregationEvent>
    <AggregationEvent>
        <parentID>BOX-002</parentID>
        <childEPCs>
            <epc>SN-1002</epc>
        </childEPCs>
    </AggregationEvent>
    <AggregationEvent>
        <parentID>PALLET-001</parentID>
        <childEPCs>
            <epc>BOX-001,BOX-002</epc>
        </childEPCs>
    </AggregationEvent>
</events>

预期输出XML

<root>
    <despatchAdvice>
        <id>PALLET-001</id>
        <parentLevelId/>
        <serialNumber/>
    </despatchAdvice>
    <despatchAdvice>
        <id>BOX-001</id>
        <parentLevelId>PALLET-001</parentLevelId>
        <serialNumber>SN-1001</serialNumber>
    </despatchAdvice>
    <despatchAdvice>
        <id>BOX-002</id>
        <parentLevelId>PALLET-001</parentLevelId>
        <serialNumber>SN-1002</serialNumber>
    </despatchAdvice>
</root>

关键逻辑说明

  • (//AggregationEvent)[last()]:精准定位最后一个聚合事件,确保顶层节点的ID正确
  • //AggregationEvent[position() &lt; last()]:仅遍历前两个聚合事件,避免重复处理顶层节点
  • 前两个条目的parentLevelId直接引用最后一个事件的parentID,保证层级关联正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:26:08