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

含命名空间XML转ABAP内表触发CX_ST_MATCH_ELEMENT异常求助

问题描述

尝试将带命名空间的根标签<CBISDDStsRptLogMsg>的XML文件反序列化为ABAP内表时,触发CX_ST_MATCH_ELEMENT异常,调试发现处理到<OrgnlPmtInfAndSts>标签时崩溃。目标是提取可重复的<TxInfAndSts>节点下<Rsn>的<Cd>值与<AddtlInf>值。

提供的XML片段:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<CBISDDStsRptLogMsg xmlns="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
    <GrpHdr>
        <MsgId>.....</MsgID>
    </GrpHdr>
    <OrgnlGrpInfAndSts>
        ...
                 ...
    </OrgnlGrpInfAndSts>
    <OrgnlPmtInfAndSts>
        <OrgnlPmtInfId>...</OrgnlPmtInfId>
        <TxInfAndSts>
            <OrgnlInstrId>.....</OrgnlInstrId>
            <OrgnlEndToEndId>.....</OrgnlEndToEndId>
            <TxSts>.....</TxSts>
            <StsRsnInf>
                <Orgtr>
                    <Nm>.....</Nm>
                </Orgtr>
                <Rsn>
                    <Cd>ABC</Cd>
                </Rsn>
                <AddtlInf>XYZ</AddtlInf>
            </StsRsnInf>
        </TxInfAndSts>
    </OrgnlPmtInfAndSts>
</CBISDDStsRptLogMsg>

当前使用的Simple Transformation(STRANS)代码片段:

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary">

  <tt:root name="CBISDDStsRptLogMsg" type="ddic:ZEUDDR_XML_IT"/>

  <tt:template>
    <CBISDDStsRptLogMsg xmlns="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" tt:ref=".CBISDDStsRptLogMsg">
      <tt:skip name="GrpHdr"/>
      <tt:skip name="OrgnlGrpInfAndSts"/>
      <OrgnlPmtInfAndSts>
        <tt:skip name="OrgnlPmtInfId"/>
        <tt:loop ref="ITEMS">
          <TxInfAndSts>
            <tt:skip name="OrgnlInstrId"/>
            <tt:skip name="OrgnlEndToEndId"/>
            <tt:skip name="TxSts"/>
            <StsRsnInf>
              <tt:skip name="Orgtr"/>
              <Rsn>
                <Cd tt:value-ref="REASON_CODE"/>
              </Rsn>
              <AddtlInf tt:value-ref="REASON_TEXT"/>
            </StsRsnInf>
            <OrgnlTxRef>

            </OrgnlTxRef>
          </TxInfAndSts>
        </tt:loop>
      </OrgnlPmtInfAndSts>

    </CBISDDStsRptLogMsg>
  </tt:template>

</tt:transform>
错误原因分析
  1. 命名空间未正确绑定:XML中所有子元素(包括<OrgnlPmtInfAndSts>、<TxInfAndSts>等)都继承了根节点的命名空间urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00,但STRANS模板中的这些子元素未关联该命名空间,导致Simple Transformation无法匹配到XML中的对应节点,触发元素匹配异常。
  2. 冗余节点定义:STRANS模板中包含了XML片段里不存在的<OrgnlTxRef>节点,ST会强制期望找到该元素,找不到则抛出匹配异常。
  3. 潜在的重复节点处理缺失:如果XML中存在多个<OrgnlPmtInfAndSts>节点,当前模板仅处理单个节点,后续节点会导致匹配失败(当前崩溃点在第一个该节点,主要原因还是前两点)。
解决方法

1. 绑定命名空间

在STRANS的tt:transform标签中定义根节点命名空间的前缀,然后所有XML子元素都使用该前缀,确保ST能正确识别命名空间下的节点:

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" 
              xmlns:ddic="http://www.sap.com/abapxml/types/dictionary"
              xmlns:cbi="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00">

  <tt:root name="CBISDDStsRptLogMsg" type="ddic:ZEUDDR_XML_IT"/>

  <tt:template>
    <cbi:CBISDDStsRptLogMsg tt:ref=".CBISDDStsRptLogMsg">
      <tt:skip name="GrpHdr" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/>
      <tt:skip name="OrgnlGrpInfAndSts" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/>
      <cbi:OrgnlPmtInfAndSts>
        <tt:skip name="OrgnlPmtInfId" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/>
        <tt:loop ref="ITEMS">
          <cbi:TxInfAndSts>
            <tt:skip name="OrgnlInstrId" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/>
            <tt:skip name="OrgnlEndToEndId" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/>
            <tt:skip name="TxSts" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/>
            <cbi:StsRsnInf>
              <tt:skip name="Orgtr" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/>
              <cbi:Rsn>
                <cbi:Cd tt:value-ref="REASON_CODE"/>
              </cbi:Rsn>
              <cbi:AddtlInf tt:value-ref="REASON_TEXT"/>
            </cbi:StsRsnInf>
          </cbi:TxInfAndSts>
        </tt:loop>
      </cbi:OrgnlPmtInfAndSts>
    </cbi:CBISDDStsRptLogMsg>
  </tt:template>

</tt:transform>

2. 移除冗余节点

删除STRANS模板中XML不存在的<OrgnlTxRef>节点,避免ST期望匹配不存在的元素。

3. 处理重复的<OrgnlPmtInfAndSts>节点(可选)

如果XML中存在多个<OrgnlPmtInfAndSts>节点,需要用tt:loop包裹该节点,确保所有节点都能被处理:

<tt:loop ref="PMT_INF_ITEMS">
  <cbi:OrgnlPmtInfAndSts>
    <tt:skip name="OrgnlPmtInfId" namespace="urn:CBI:xsd:CBISDDStsRptLogMsg.00.01.00"/>
    <tt:loop ref="ITEMS">
      <!-- 原TxInfAndSts处理逻辑 -->
    </tt:loop>
  </cbi:OrgnlPmtInfAndSts>
</tt:loop>

注:需确保ZEUDDR_XML_IT结构包含内表PMT_INF_ITEMS,其行结构包含ITEMS内表。

4. 确认ABAP内表结构

确保ZEUDDR_XML_IT结构包含:

  • 内表ITEMS,其行结构包含REASON_CODE(类型匹配<Cd>的字符串)和REASON_TEXT(类型匹配<AddtlInf>的字符串)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:09:55