Object 到ABAP对象的简单XSLT转换

Object 到ABAP对象的简单XSLT转换,object,xslt,abap,Object,Xslt,Abap,我再次陷入了从XML到ABAP的转换。这次,我想将XML数据直接放入ABAP对象中 我的XML如下所示: <qualityStatus> <address>0</address> <bounceRisk>0</bounceRisk> <checked>1</checked> <domain>1</domain> <domainScores>

我再次陷入了从XML到ABAP的转换。这次,我想将XML数据直接放入ABAP对象中
我的XML如下所示:

<qualityStatus>
    <address>0</address>
    <bounceRisk>0</bounceRisk>
    <checked>1</checked>
    <domain>1</domain>
    <domainScores>
        <domainScore>
            <domain>gmx.de</domain>
            <score>0.8333333134651184</score>
        </domainScore>
        <domainScore>
            <domain>ggs.de</domain>
            <score>0.6666666269302368</score>
        </domainScore>
        <domainScore>
            <domain>xyz.de</domain>
            <score>0.6666666269302368</score>
        </domainScore>
    </domainScores>
    <extSyntax>1</extSyntax>
    <mailserver>1</mailserver>
    <mailserverDiagnosis>1</mailserverDiagnosis>
    <probability>1</probability>
    <syntax>1</syntax>
</qualityStatus>
最后,我用类的一个实例调用我的转换:

CALL TRANSFORMATION zst_addressquality
      SOURCE XML lw_xml
      RESULT result = lo_addressquality.
现在,当通过转换代码进行调试时,它成功地注意到给定lw_xml的所有字段,并似乎将它们写入对象lou addressquality。但是对象属性之后保持为空
测试序列化时,我可以访问包含我的对象的结果,但result-w_地址(以及所有其他地址)为空
在测试期间,我创建了一个名称和类型完全相同的结构。有了它,它就按预期工作了

我错过了什么?在处理到ABAP对象的转换时,还有什么需要注意的吗?
_编辑:在更改为XSLT之后,我可以在代码抛出CX\U XSLT\U ABAP\U CALL\U错误之前获取直到W\U地址。因此,我仍然无法正确访问对象的属性:|_

对象只能通过XSL转换进行序列化/反序列化。用简单的转换dixit是不可能做到的:

ST程序仅限于转换基本和结构化ABAP数据以及内部表。当前不支持转换引用变量和引用对象

XSL转换必须将XML转换为,简言之,它对应于如下结构:

<?xml ...?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
  <asx:values>
    ...
  </asx:values>
  <asx:heap>
    ...
  </asx:heap>
</asx:abap>
例如:

REPORT.
CLASS serialization_demo DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_serializable_object.
    DATA attribute TYPE i.
ENDCLASS.

START-OF-SELECTION.
  DATA obj_ref TYPE REF TO serialization_demo.
  DATA xstring TYPE xstring.
  CREATE OBJECT obj_ref.
  obj_ref->attribute = 5.
  CALL TRANSFORMATION id " serialize
        SOURCE root = obj_ref
        RESULT XML xstring.
  CLEAR obj_ref.
  CALL TRANSFORMATION id " deserialize
        SOURCE XML xstring
        RESULT root = obj_ref.
ASXML(在xstring变量中):


5.

请发布一个非常简单的案例,以便我们能够重现:一个具有一个公共实例属性的类,仅此字段的转换(无需过度复杂化,因为它不是问题的主题),一个仅此字段的XML示例,以及反序列化的代码(您已经完成了)。感谢Sandra,我又改回了XSLT。在调试器中,它在prg:标记处中断。前缀“local”是什么意思?序列化演示是类名,但是local指的是什么?类所在的包?文档中对此进行了解释:“如果类是本地类,则在名称前面添加前缀
local
,并用点(.)分隔,以将其与同名的全局类区分开来。”在编辑问题时,我可以看出您没有遵循我的建议:理解ASXML应该是什么样子的最简单方法是使用ID转换序列化(将变量转换为XML)您的对象引用,请参见ASXML的样子(您会看到它不包含前缀
local
,因为您没有本地类,您只有一个类池ZCL\u ADDRESS\u QUALITY),然后调整转换以生成与XML相同的内容。
<?xml ...?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
  <asx:values>
    ...
  </asx:values>
  <asx:heap>
    ...
  </asx:heap>
</asx:abap>
CALL TRANSFORMATION id SOURCE anyRootName = yourObjectReference RESULT XML asXMLutf8xstring.
REPORT.
CLASS serialization_demo DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_serializable_object.
    DATA attribute TYPE i.
ENDCLASS.

START-OF-SELECTION.
  DATA obj_ref TYPE REF TO serialization_demo.
  DATA xstring TYPE xstring.
  CREATE OBJECT obj_ref.
  obj_ref->attribute = 5.
  CALL TRANSFORMATION id " serialize
        SOURCE root = obj_ref
        RESULT XML xstring.
  CLEAR obj_ref.
  CALL TRANSFORMATION id " deserialize
        SOURCE XML xstring
        RESULT root = obj_ref.
<?xml version="1.0" encoding="utf-8"?>
<asx:abap version="1.0" xmlns:asx="http://www.sap.com/abapxml">
  <asx:values>
    <ROOT href="#o3"/>
  </asx:values>
  <asx:heap xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:abap="http://www.sap.com/abapxml/types/built-in" xmlns:cls="http://www.sap.com/abapxml/classes/global" xmlns:dic="http://www.sap.com/abapxml/types/dictionary">
    <prg:SERIALIZATION_DEMO id="o3" xmlns:prg="http://www.sap.com/abapxml/classes/program/ZZSRO_TEST16I">
      <local.SERIALIZATION_DEMO>
        <ATTRIBUTE>5</ATTRIBUTE>
      </local.SERIALIZATION_DEMO>
    </prg:SERIALIZATION_DEMO>
  </asx:heap>
</asx:abap>