CX_ST_MATCH_ELEMENT 在 ABAP 简单转换中

CX_ST_MATCH_ELEMENT in ABAP Simple Transformation

我正在尝试将一个简单的 XML 转换为 ABAP 并使用事务 XSLT_TOOL。我得到的转储

Errores tiempo ejec. ST_MATCH_FAIL Excepción
CX_ST_MATCH_ELEMENT Fecha y hora 31.07.2017 18:55:46

XML:

<?xml version="1.0" encoding="UTF-8"?>
<objects type="array">
    <object>
        <transaction-id type="integer">28</transaction-id>
        <message type="symbol">FAILURE</message>
        <errors type="array">
            <error>
                <row type="integer">0</row>
                <field>Sin datos</field>
                <message>El Json no puede estar en blanco.</message>
            </error>
        </errors>
    </object>
</objects>

这是程序生成的:

<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined">   <tt:root name="ZDGR2_RETORNOINVOCACION" type="ddic:ZDGR2_RETORNOINVOCACION"/>   <tt:template>
    <ZDGR2_RETORNOINVOCACION>
      <MESSAGE tt:value-ref=".ZDGR2_RETORNOINVOCACION.MESSAGE"/>
      <TRANSACTION_ID tt:value-ref=".ZDGR2_RETORNOINVOCACION.TRANSACTION_ID"/>
      <ERRORS>
        <tt:loop ref=".ZDGR2_RETORNOINVOCACION.ERRORS">
          <ZDGR2_ERRORS>
            <FILA tt:value-ref="FILA"/>
            <FIELD tt:value-ref="FIELD"/>
            <MESSAGE tt:value-ref="MESSAGE"/>
          </ZDGR2_ERRORS>
        </tt:loop>
      </ERRORS>
    </ZDGR2_RETORNOINVOCACION>   
</tt:template> </tt:transform>

这个简单的程序:

DATA: lv_xml Type string. 
DATA: it_resultado type ZDGR2_RETORNOINVOCACION. 
CONCATENATE '<?xml version="1.0" encoding="UTF-8"?><objects type="array"><object><transaction-id type="integer">28</transaction-id><message type="symbol">FAILURE</message><errors type="array"><error><row type="integer">0</row><field>Sin datos</field>' '<message>El Json no puede estar en blanco.</message></error></errors></object></objects>' INTO lv_xml. 

CALL TRANSFORMATION zdgr2_retornoinvocacion
     SOURCE XML lv_xml
     RESULT zdgr2_retornoinvocacion = it_resultado.

我做错了什么?

当 XML 中的标签与转换中的标签名称或顺序不同时,就会发生此转储。

在你的例子中我看到了多个问题:

你的 XML 结构是这样开始的:

<object>
   <transaction-id type="integer">28</transaction-id>
   <message type="symbol">FAILURE</message>

但是你的转型是这样开始的:

<ZDGR2_RETORNOINVOCACION>
  <MESSAGE tt:value-ref=".ZDGR2_RETORNOINVOCACION.MESSAGE"/> 
  <TRANSACTION_ID tt:value-ref=".ZDGR2_RETORNOINVOCACION.TRANSACTION_ID"/>

所以在我看来 <ZDGR2_RETORNOINVOCACION> 应该命名为 <object><MESSAGE><TRANSACTION_ID> 必须交换。

同样在错误子结构中你有一些不匹配

 <error>
     <row type="integer">0</row>
     <field>Sin datos</field>
     <message>El Json no puede estar en blanco.</message>
  </error>

<ZDGR2_ERRORS>
     <FILA tt:value-ref="FILA"/>
     <FIELD tt:value-ref="FIELD"/>
     <MESSAGE tt:value-ref="MESSAGE"/>
</ZDGR2_ERRORS>

<ZDGR2_ERRORS> 应命名为 <error><FILA> 应命名为 <row>

所以重要的规则是标签在 xml 文件中具有相同的名称和顺序(不区分大小写,因此 <OBJECT><object> 无关紧要).

我的一个建议是,您可以调试转换。一步一步地通过它转储的标签,大多数时候名称或顺序不正确。因此您可以快速找到错误,而不必比较整个 xml 结构。