在 ST 转换中连接值?
Concatenate values in ST Transformation?
我正在通过 ST 编写序列化,它应该将多个 vars/nodes 放入一个 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,其中 consists of 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 in <row r="1">
对应于 ROW_ID
中的行号
1_xcell1 in <c r="1_xcell1">
是根 table、[=16 的当前行的 ROW_ID
的串联=] 当前 ROW
行的字段,文字 cell
和 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>
标签中的较低杠杆上进行映射。
如您所见,这种方法行不通,因为我不知道如何放置循环计数器以及如何将它与其他值连接起来。
我在 answers.sap.com (1, 2, 3) 上发现了几个旧话题,但没有人回答。
ST 中是否有像 XSLT 中那样的连接:
`<xsl:element name="{concat($segment2, '_', $tail2)}">`?
在 ABAP 中是否有像 SY-TABIX
这样的循环的内置变量?
如果您有模式 (xsd) 文件,您可以使用报告 SPROX_XSD2WSDL
将其转换为 wsdl,然后使用它创建服务使用者。您可以使用下面的代码来使用此服务使用者从自动生成的转换中获取 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( ).
这应该有效(如果 $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>
...
关于循环计数器,我认为它不能在简单转换中完成,在内部 table 中显式传递行号的解决方案是最好的。
我正在通过 ST 编写序列化,它应该将多个 vars/nodes 放入一个 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,其中 consists of 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 in <row r="1">
对应于 ROW_ID
1_xcell1 in <c r="1_xcell1">
是根 table、[=16 的当前行的 ROW_ID
的串联=] 当前 ROW
行的字段,文字 cell
和 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>
标签中的较低杠杆上进行映射。
如您所见,这种方法行不通,因为我不知道如何放置循环计数器以及如何将它与其他值连接起来。
我在 answers.sap.com (1, 2, 3) 上发现了几个旧话题,但没有人回答。
ST 中是否有像 XSLT 中那样的连接:
`<xsl:element name="{concat($segment2, '_', $tail2)}">`?
在 ABAP 中是否有像 SY-TABIX
这样的循环的内置变量?
如果您有模式 (xsd) 文件,您可以使用报告 SPROX_XSD2WSDL
将其转换为 wsdl,然后使用它创建服务使用者。您可以使用下面的代码来使用此服务使用者从自动生成的转换中获取 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( ).
这应该有效(如果 $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>
...
关于循环计数器,我认为它不能在简单转换中完成,在内部 table 中显式传递行号的解决方案是最好的。