Объединить значения в преобразовании ST? - PullRequest
1 голос
/ 13 июля 2020

Я пишу сериализацию через 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, который состоит из VAL и INDEX полей

Ожидаемый образец вывода для первой строки:

  <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 в <row r="1"> соответствует номеру строки из ROW_ID

1_xcell1 в <c r="1_xcell1"> является конкатенацией ROW_ID из текущей строки of root table, INDEX field of current ROW line, literal cell and l oop counter of ROW table

Преобразование, которое я получил, это:

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

, где я поместил ROW_ID в var для использования при отображении на нижнем рычаге в теге <c>.

Как видите, этот подход не будет работать, потому что я понятия не имею, как поставить счетчик l oop и как связать его с другими значениями.

Я нашел пару старых тем на answers.sap.com ( 1, 2 , 3 ), но они остаются без ответа.

Есть ли в ST конкатенация, как в XSLT:

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

Is есть встроенная переменная для циклов, например SY-TABIX в ABAP?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Это должно работать (если $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>
              ...

Что касается счетчика l oop, я думаю, что это невозможно сделать в Простые преобразования, ваше решение явно передать номер строки во внутренней таблице является лучшим.

0 голосов
/ 13 июля 2020

Если у вас есть файл схемы (xsd), вы можете преобразовать его в wsdl с помощью report SPROX_XSD2WSDL, а затем создать с его помощью потребителя службы. Вы можете использовать приведенный ниже код, чтобы использовать этого потребителя службы для получения 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( ).
...