XSLT转换EPCIS XML未获预期输出,请求修正指导
EPCIS XML转Despatch Advice的XSLT问题修正
问题概述
给定的EPCIS XML中,包含一个带有两个<epc>节点的shipping事件(<bizStep>包含shipping),但当前XSLT转换仅生成一个<despatchAdviceLogisticUnitLineItem>,预期应为每个<epc>生成一个对应行项目。
现有XSLT的问题
- 路径匹配错误:原代码使用
/ns0:EPCISDocument/EPCISBody/EventList/ObjectEvent作为遍历路径,但输入XML的根节点是<EPCISBody>,不存在外层的<EPCISDocument>节点,也未使用ns0命名空间,导致路径无法正确匹配目标事件。 - 未遍历单个EPC节点:在符合条件的
<ObjectEvent>中直接使用<xsl:value-of select="epcList/epc"/>,只会提取第一个<epc>的值,且未为每个<epc>生成独立的行项目结构,因此仅输出一条结果。 - 不必要的命名空间前缀:根元素使用
tns:despatchAdvice,但预期输出中没有命名空间前缀,导致输出结构不一致。
修正后的XSLT代码
<xsl:template match="/"> <despatchAdvice> <!-- 遍历所有ObjectEvent,筛选出shipping事件 --> <xsl:for-each select="/EPCISBody/EventList/ObjectEvent[contains(bizStep, 'shipping')]"> <!-- 为当前事件下的每个epc生成独立的行项目 --> <xsl:for-each select="epcList/epc"> <despatchAdviceLogisticUnitLineItem> <logisticUnitIdentification> <serialShipmentContainerCode> <serialShippingContainerCode> <xsl:value-of select="."/> </serialShippingContainerCode> </serialShipmentContainerCode> </logisticUnitIdentification> <levelId> <levelIdentification> <xsl:value-of select="."/> </levelIdentification> </levelId> </despatchAdviceLogisticUnitLineItem> </xsl:for-each> </xsl:for-each> </despatchAdvice> </xsl:template>
修正说明
- 修正路径:将遍历路径改为
/EPCISBody/EventList/ObjectEvent,匹配输入XML的实际结构;同时将筛选条件整合到select中,简化代码。 - 嵌套遍历EPC:在shipping事件内部新增
<xsl:for-each select="epcList/epc"/>,为每个<epc>生成独立的行项目,确保每个EPC对应一条输出。 - 移除命名空间前缀:将根元素改为
<despatchAdvice>,与预期输出结构一致。 - 使用
.引用当前节点:在嵌套遍历中,用.指代当前<epc>节点,简化值提取逻辑。
内容的提问来源于stack exchange,提问作者user6927606
相关产品推荐
相关产品推荐

