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 结构。
我正在尝试将一个简单的 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 结构。