ST 转换序列化期间命名空间绑定错误
Wrong namespace binding during ST transformation serialization
我有一个简单的转换来创建这样的 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>
两个 XML 文件在语法上是等价的(并且是正确的)。
SAP 没有解释 XML 命名空间分配的逻辑,但这有点不重要,因为最终语法是正确的。
最终一种可能是在标签<ORDEREXPORT>
中定义假属性cbc:dummy="" xs:dummy=""
,强制在该元素定义命名空间,并在转换后通过ABAP删除cbc:dummy="" xs:dummy=""
.
具有虚拟属性的转换:
<?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 ``.
在序列化期间使用显式 <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>
我有一个简单的转换来创建这样的 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>
两个 XML 文件在语法上是等价的(并且是正确的)。
SAP 没有解释 XML 命名空间分配的逻辑,但这有点不重要,因为最终语法是正确的。
最终一种可能是在标签<ORDEREXPORT>
中定义假属性cbc:dummy="" xs:dummy=""
,强制在该元素定义命名空间,并在转换后通过ABAP删除cbc:dummy="" xs:dummy=""
.
具有虚拟属性的转换:
<?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 ``.
在序列化期间使用显式 <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>