2

我有一个简单的转换来创建这样的 XML 文件:

<?xml version="1.0" encoding="utf-16"?>
<ORDEREXPORT xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
    xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <cbc:EXPORTDATE>2020-07-21</cbc:EXPORTDATE>
  <cbc:EXPORTTIME>10:10:46</cbc:EXPORTTIME>
  <xs:EXPORTUSER>STACKY</xs:EXPORTUSER>
</ORDEREXPORT>

但是我的转换会生成一个像这样的文件:

<?xml version="1.0" encoding="utf-16"?>
<ORDEREXPORT xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
    <cbc:EXPORTDATE xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">2020-07-21</cbc:EXPORTDATE>
    <cbc:EXPORTTIME xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">10:10:46</cbc:EXPORTTIME>
    <xs:EXPORTUSER xmlns:xs="http://www.w3.org/2001/XMLSchema">STACKY</xs:EXPORTUSER>
</ORDEREXPORT>

我希望所有命名空间都位于<ORDEREXPORT>元素中。

我怎样才能做到这一点?

我的转变:

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates"
    xmlns:ddic="http://www.sap.com/abapxml/types/dictionary"
    xmlns:def="http://www.sap.com/abapxml/types/defined">
  <tt:root name="ORDEREXPORT" type="ddic:ZORDEREXPORT_TYPE"/>
  <tt:template match="NewDataSet">
    <ORDEREXPORT xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" >
      <cbc:EXPORTDATE tt:value-ref=".ORDEREXPORT.EXPORTDATE"/>
      <cbc:EXPORTTIME tt:value-ref=".ORDEREXPORT.EXPORTTIME"/>
      <xs:EXPORTUSER tt:value-ref=".ORDEREXPORT.EXPORTUSER"/>
    </ORDEREXPORT>
  </tt:template>
</tt:transform>
4

2 回答 2

0

这两个 XML 文件在语法上是等效的(并且是正确的)。

SAP 没有解释如何分配 XML 名称空间的逻辑,但这有点不重要,因为语法最终是正确的。

最终,一种可能性是cbc:dummy="" xs:dummy=""在 tag中定义错误属性<ORDEREXPORT>,这会强制在此元素处定义命名空间,并cbc:dummy="" xs:dummy=""在转换后通过 ABAP 删除。

使用虚拟属性进行转换:

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates"
    xmlns:ddic="http://www.sap.com/abapxml/types/dictionary"
    xmlns:def="http://www.sap.com/abapxml/types/defined">
  <tt:root name="ORDEREXPORT" type="ddic:ZORDEREXPORT_TYPE"/>
  <tt:template match="NewDataSet">
    <ORDEREXPORT xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
        xs:dummy="" cbc:dummy="" >
      <cbc:EXPORTDATE tt:value-ref=".ORDEREXPORT.EXPORTDATE"/>
      <cbc:EXPORTTIME tt:value-ref=".ORDEREXPORT.EXPORTTIME"/>
      <xs:EXPORTUSER tt:value-ref=".ORDEREXPORT.EXPORTUSER"/>
    </ORDEREXPORT>
  </tt:template>
</tt:transform>

转换后立即获取文件(在 ABAP 7.52 中),包括虚拟属性:

<?xml version="1.0" encoding="utf-16"?>
<ORDEREXPORT xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
    xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xs:dummy="" cbc:dummy="">
  <cbc:EXPORTDATE>2020-07-21</cbc:EXPORTDATE>
  <cbc:EXPORTTIME>10:10:46</cbc:EXPORTTIME>
  <xs:EXPORTUSER>STACKY</xs:EXPORTUSER>
</ORDEREXPORT>

调用转换并删除虚拟属性的 ABAP 代码:

DATA(ls_orderexport) = VALUE zorderexport_type( 
    exportdate = '20200721' exporttime = '101046' exportuser = 'STACKY' ).

DATA string TYPE string.
CALL TRANSFORMATION z_transfo_name 
    SOURCE orderexport = ls_orderexport
    RESULT XML string.

REPLACE 'xs:dummy="" cbc:dummy=""' IN string WITH ``.
于 2020-07-22T06:28:36.820 回答
0

在序列化期间使用显式<tt:namespace>命令将命名空间绑定到元素。

对我来说,这种转换有效并产生了你想要的东西:

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" >

  <tt:root name="ORDEREXPORT" type="ddic:ZORDEREXPORT_TYPE" />
  <tt:template>
    <ORDEREXPORT xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"> <tt:namespace name="xs"/><tt:namespace name="cbc"/>
              <cbc:EXPORTDATE>
                  <tt:value ref=".ORDEREXPORT.EXPORTDATE"/>
              </cbc:EXPORTDATE>
              <cbc:EXPORTTIME>
                  <tt:value ref=".ORDEREXPORT.EXPORTTIME"/>
              </cbc:EXPORTTIME>
              <xs:EXPORTUSER>
                  <tt:value ref=".ORDEREXPORT.EXPORTUSER"/>
              </xs:EXPORTUSER>
    </ORDEREXPORT>
  </tt:template>

</tt:transform>
于 2020-09-24T11:06:59.780 回答