2

我正在尝试将简单的 XML 转换为 ABAP 并使用事务XSLT_TOOL。我得到的垃圾场

错误 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>

xslt_tool

在此处输入图像描述

这是程序生成的:

<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.

我究竟做错了什么?

4

1 回答 1

1

当 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 结构。

于 2017-08-03T09:27:26.680 回答