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

如何在ABAP简单转换中反序列化复杂混合元素数据类型

可以在ABAP简单转换(ST)中处理该混合内容场景,无需XSLT

问题原因

你遇到的报错是因为原ST代码将<CHILD_1>视为纯文本节点,通过tt:value-ref="$ref.child_1"直接读取其文本内容,但实际<CHILD_1>是混合内容节点(包含文本段和<CHILD_2>子元素),ST解析时发现预期的纯文本结束前出现了子元素,因此抛出错误。


解决方案

根据<CHILD_1>的结构是否固定,有两种实现方式:

1. 固定结构场景(文本+CHILD_2+文本)

如果<CHILD_1>的内容始终是「前置文本 + <CHILD_2> + 后置文本」的固定格式,可以直接在ST模板中依次捕获各部分内容:

步骤1:定义ABAP目标结构
TYPES: BEGIN OF ty_child1,
         prefix_text  TYPE string, " CHILD_2之前的文本
         child2_text  TYPE string, " CHILD_2的内容
         suffix_text  TYPE string, " CHILD_2之后的文本
       END OF ty_child1,
       ty_parent TYPE BEGIN OF ty_parent,
                     child1 TYPE ty_child1,
                   END OF ty_parent.
步骤2:编写ST转换代码
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">
  <tt:root name="RESULT" type="TY_PARENT"/>
  <tt:template>
    <PARENT>
      <CHILD_1>
        <!-- 提取CHILD_2之前的文本 -->
        <tt:value ref="$RESULT.CHILD1.PREFIX_TEXT"/>
        <CHILD_2>
          <!-- 提取CHILD_2的内容 -->
          <tt:value ref="$RESULT.CHILD1.CHILD2_TEXT"/>
        </CHILD_2>
        <!-- 提取CHILD_2之后的文本 -->
        <tt:value ref="$RESULT.CHILD1.SUFFIX_TEXT"/>
      </CHILD_1>
    </PARENT>
  </tt:template>
</tt:transform>

2. 动态结构场景(任意数量的文本段和子元素)

如果<CHILD_1>的内容结构不固定(比如多个文本段和子元素交替),可以通过tt:loop遍历<CHILD_1>的所有子节点,根据节点类型/名称分别处理:

步骤1:定义ABAP目标结构
TYPES: BEGIN OF ty_content_segment,
         seg_type TYPE c LENGTH 1, " 'T'=文本段, 'C'=CHILD_2元素
         seg_text TYPE string,     " 对应内容
       END OF ty_content_segment,
       ty_child1 TYPE TABLE OF ty_content_segment,
       ty_parent TYPE BEGIN OF ty_parent,
                     child1 TYPE ty_child1,
                   END OF ty_parent.
步骤2:编写ST转换代码
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">
  <tt:root name="RESULT" type="TY_PARENT"/>
  <tt:template>
    <PARENT>
      <CHILD_1>
        <!-- 遍历CHILD_1的所有子节点 -->
        <tt:loop ref="node()" name="CUR_NODE">
          <!-- 处理文本节点 -->
          <tt:cond check="node-type($CUR_NODE) = 'TEXT_NODE'">
            <tt:append ref="$RESULT.CHILD1" value="(seg_type = 'T', seg_text = $CUR_NODE)"/>
          </tt:cond>
          <!-- 处理CHILD_2元素节点 -->
          <tt:cond check="node-name($CUR_NODE) = 'CHILD_2'">
            <tt:append ref="$RESULT.CHILD1" value="(seg_type = 'C', seg_text = $CUR_NODE)"/>
          </tt:cond>
        </tt:loop>
      </CHILD_1>
    </PARENT>
  </tt:template>
</tt:transform>

关键指令说明

  • node():代表当前节点(此处为<CHILD_1>)的所有子节点集合,包含文本和元素。
  • node-type($CUR_NODE):判断节点类型,TEXT_NODE表示文本节点,ELEMENT_NODE表示元素节点。
  • node-name($CUR_NODE):获取元素节点的名称,用于区分不同子元素。
  • tt:append:将处理后的内容段添加到内表类型的字段中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:08:21