如何在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
相关产品推荐
相关产品推荐

