XSLT循环逻辑问题排查及目标XML输出实现咨询
问题诊断与解决方案
核心问题分析
你原代码的逻辑错误在于没有区分最后一个AggregationEvent和前两个的角色差异:
- 错误地统一遍历所有
AggregationEvent,没有单独处理顶层节点(对应最后一个的parentID) - 前两个条目的
parentLevelId没有正确关联到最后一个AggregationEvent的parentID,导致层级结构不符合要求
实现思路
按照需求拆解成两步处理:
- 单独提取最后一个
AggregationEvent,生成第一个顶层despatchAdvice条目 - 遍历前两个
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() < 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() < last()]:仅遍历前两个聚合事件,避免重复处理顶层节点- 前两个条目的
parentLevelId直接引用最后一个事件的parentID,保证层级关联正确
内容的提问来源于stack exchange,提问作者user6927606
相关产品推荐
相关产品推荐

