2

我正在通过 ST 编写序列化,它应该将多个变量/节点放入一个 XML 标记中。

输入应序列化的 ABAP itab:

ROW_ID       ROW
               VAL       INDEX
  1            val55        X
               val32        Y
               val46        X

  2            val8         X
               val16        
               val789        

  3            val78        Y
               val53        Y
               val98        Y

其中每个ROW值都是一个 itab,它 VALINDEX字段组成

第一行的预期输出样本:

  <rows>
    <row r="1">
        <c r="1_xcell1">
            <v>val55</v>
        </c>
        <c r="1_ycell2">
            <v>val32</v>
        </c>
        <c r="1_xcell3">
            <v>val46</v>
        </c>
     <row>
   </rows>

这里

1 in<row r="1">对应于行号ROW_ID

1_xcell1 in<c r="1_xcell1">ROW_ID根表INDEX的当前行、当前行的字段、表的ROW文字cell和循环计数器的串联ROW

我最终得到的转变是:

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" template="main">
  <tt:root name="root"/>
  <tt:variable name="range" val="11"/>
  <tt:template name="main">
      <rows>
        <tt:loop name="row" ref="root">
          <row>
            <tt:attribute name="r" value-ref="row_id"/>
            <tt:assign to-var="range" ref="row_id"/>
            <tt:loop name="cells" ref="$row.ROW">
            <tt:serialize>
              <c>
                <tt:attribute name="r"><tt:write var="range" map="val(I(1)) = xml('1_xcell1'), val(I(2)) = xml('2_xcell2'), val(I(3)) = xml('3_xcell3)"/></tt:attribute>
                <v><tt:value ref="value"/></v>
              </c>
            </tt:serialize>
            </tt:loop>
          </row>
        </tt:loop>
      </rows>
  </tt:template>
</tt:transform>

我将in 放入 var 以用于标记ROW_ID中下杆的映射。<c>

如您所见,这种方法不起作用,因为我不知道如何放置循环计数器以及如何将其与其他值连接起来。

我在 answers.sap.com ( 123 )上找到了几个旧线程,但没有得到答复。

ST 中是否有像 XSLT 中的串联:

`<xsl:element name="{concat($segment2, '_', $tail2)}">`?

SY-TABIX是否有像ABAP中的循环的内置变量?

4

2 回答 2

2

这应该有效(如果$row.row_id等于1,它将生成...<c r="1_xcell1">...):

            ...
              <c>
                <tt:attribute name="r">
                  <tt:value ref="$row.row_id"/>_xcell<tt:value ref="$row.row_id"/>
                </tt:attribute>
              ...

关于循环计数器,我认为它不能在简单转换中完成,您在内部表中显式传递行号的解决方案是最好的。

于 2020-07-14T18:27:20.137 回答
-1

如果您有模式 (xsd) 文件,您可以将其转换为带有报告的 wsdl,SPROX_XSD2WSDL然后使用它创建服务使用者。您可以使用以下代码来使用此服务使用者从自动生成的 trasform 中获取 xml(也可以检查此转换以获取解决方案的提示)。

  data: lo_wph     type ref to cl_ws_payload_handler.
  data: lt_param   type prx_t_param,
        ls_param   type prx_s_param,
        ls_struct  type zmymessage,
        lv_xmldata type xstring.

      create object lo_wph
        exporting
          proxy_type   = 'CLAS'
          proxy_name   = 'ZMYPROXY'
          proxy_method = 'OP1'.

      ls_param-name = 'INPUT'.
      ls_param-type_name = 'zmymessage'.
      ls_param-ifr_name = 'MyXmlRoot'.
      ls_param-ifr_namespace = 'http://myschemanamespace'.
      ls_param-xml_name = 'MyXmlRoot'.
      ls_param-xml_namespace = 'http://myschemanamespace'.
      get reference of ls_struct into ls_param-value.
      append ls_param to lt_param.

      call method lo_wph->if_ws_payload_handler~get_payload_from_request_data
        exporting
          request_data = lt_param
        receiving
          payload      = lo_wp.

      lv_xmldata = lo_wp->get_xml_binary( ).
于 2020-07-13T18:49:55.387 回答