繁体   English   中英

到 ABAP 对象的简单 XSLT 转换

[英]Simple XSLT transformation into ABAP Object

我再次陷入从 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>

编辑:我改回 XSLT 转换,缩短为一个属性,如下所示:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
<xsl:output encoding="iso-8859-1" indent="yes" method="xml" version="1.0"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/qualityStatus">
    <asx:abap version="1.0" xmlns:asx="http://www.sap.com/abapxml">
        <asx:values>
            <ROOT href="#o26"/>
        </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">
            <cls:ZCL_ADDRESS_QUALITY id="o26" >
                <local.ZCL_ADDRESS_QUALITY>
                    <W_ADDRESS>
                        <xsl:value-of select="address"/>
                    </W_ADDRESS>
                    <!--More attributes here-->
                </local.ZCL_ADDRESS_QUALITY>
            </cls:ZCL_ADDRESS_QUALITY>
        </asx:heap>
    </asx:abap>
</xsl:template>

我的对象属性现在都是公开的,因为我认为这可能是问题所在。 但是,setter 和 getter 确实存在。 是的,我的类确实实现了 if_serializable_object 接口。

 DATA:
  w_address             TYPE char1,
  w_bouncerisk          TYPE char1,
  w_checked             TYPE char1,
  w_decoded             TYPE stringval,
  w_domain              TYPE char1,
  w_domainscores        TYPE z_domainscore_t, "Table type for name + score
  w_extsyntax           TYPE char1,
  w_mailserver          TYPE char1,
  w_mailserverdiagnosis TYPE char1,
  w_probability         TYPE char1,
  w_syntax              TYPE char1,
  w_syntaxwarnings      TYPE z_syntaxwarnings_t. "Table of syntaxwarnings

最后,我用我的类的一个实例调用我的转换:

CALL TRANSFORMATION zst_addressquality
      SOURCE XML lw_xml
      RESULT result = lo_addressquality.

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

我错过了什么? 在转换为 ABAP 对象时,还有什么我需要注意的吗? _Edit:更改为 XSLT 后,我可以在我的代码抛出 CX_XSLT_ABAP_CALL_ERROR 之前得到 W_ADDRESS。 所以,我仍然无法正确访问对象的属性。 :|_

只能使用XSL转换对对象进行序列化/反序列化。 不可能通过简单的转换来做到这一点,dixit ABAP 文档

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

XSL 转换必须将 XML 转换为ASXML ,简而言之对应于这样的结构:

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

理解 ASXML 应该是什么样子的最简单方法是使用身份转换(这是一个 XSL 转换)序列化您的对象引用,然后调整您的转换以生成相同类型的 asXML:

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.

ASXML(在 xstring 变量中):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM