如何在 Abap Simple Transformation 中添加 XML 命名空间

问题描述 投票:0回答:1

我使用简单转换从内部表中获取 XML。这是输出 XML。

<?xml version="1.0" encoding="UTF-8"?>
<Complement>
 <Document Doc="AAA">

    <Locations>             
        <Location>
            <Origin 
                RFC="URE180429TM6"/>            
            <Address 
                Country="SOME_COUNTRY" 
                />
                [....]
        </Location>
    </Locations>
    
    <Products NumTotal="1">
        <Product
            ValorProduct="12164501"
            />
            [....]
       </Product>
    </Products>

    [....]....

 </Document>
</Complement>

但是现在我需要做的是更改一些 XML 元素名称(重命名它们)..这应该使我的 XML 看起来像这样:

例如,我需要第一个元素(补语)看起来像 cfdi:Complement (在 cfdi 和补语之间使用冒号

:
)...等等等等

<cfdi:Complement>
  <document:Document Doc="AAA">

    <document:Locations>                
        <document:Location>
            <document:Origin 
                RFC="URE180429TM6"/>            
            <document:Domicilio 
                Country="NIGERIA" 
                />
                [....]
        </document:Location>
    </document:Locations>
    
    <document:Products NumTotal="1">
        <document:Product
            ValorProduct="12164501"
            />
            [....]
       </document:Product>
    </document:Products>

    [....]....

  </document:Document>
</cfdi:Complement>

我一直在尝试直接从简单转换代码更改元素名称,但它不起作用:

<?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="COMPLEMENT" type="ddic:ZCOMPLEMENT"/>
<tt:template>
<tt:namespace name="cfdi"/>
<tt:namespace name="document"/>

  <cfdi:Complement>    "<----- I get error from this lines
    <document:Document>   "<----- I get error from this lines
      <tt:attribute name="Doc" value-ref=".COMPLEMENT.DOCUMENT.DOC"/>

      <document:Locations>       
        <Location>            
          <Origin>        
            <tt:attribute name="RFC" value-ref=".COMPLEMENT.DOCUMENT.LOCATIONS.LOCATION.ORIGIN.RFC"/>
              [....]
          </Origin>              
          <Address>
            <tt:attribute name="Country" value-ref=".COMPLEMENT.DOCUMENT.LOCATIONS.LOCATION.ADDRESS.COUNTRY"/>
              [....]
          </Address>                            
        </Location>
      </Locations>

      <Products>         
        <tt:attribute name="NumTotal" value-ref=".COMPLEMENT.DOCUMENT.PRODUCTS.NUMTOTAL"/>            
          <Product>
            <tt:attribute name="ValorProduct" value-ref="VALORPRODUCT"/>
              [....]
          </Product>
      </Products>
      
        [....]....
      
    </Document>
  </Complement>

</tt:template>
</tt:transform>

这些是我得到的错误:

undeclared namespace prefix 'cfdi'

undeclared namespace prefix 'document'

这是简单的转换代码:

我只需要更改Element的名称即可。但我不认为这比看起来更难。

请帮我解决这个问题。我是这个 Abap 世界的新人。或者任何想法都会对我有很大帮助。问候

xml transformation abap-st
1个回答
0
投票

我之前遇到过一些命名空间问题,也许这个线程有帮助。

这是参考代码。正如您所看到的,您必须定义名称空间并按定义方式使用它,此处为 ns1。

<tt:template>

<top_element
    xmlns:ns1="xsd/namespacesForBoxes"
    xmlns:ns2="xsd/namespacesForCartons"
    xmlns:ns3="xsd/namespacesForPallets">
  <tt:namespace name="ns1"/>
  <tt:namespace name="ns2"/>
  <tt:namespace name="ns3"/>

    <tt:cond s-check="not-initial(ref('.telegram.BOX_ID'))">
      <ns1:container>
        <tt:attribute name="box-id" value-ref=".telegram.BOX_ID"/>
      </ns1:container>
    </tt:cond>

    <tt:cond s-check="not-initial(ref('.telegram.CARTON_ID'))">
      <ns2:container>
        <tt:attribute name="carton-id" value-ref=".telegram.CARTON_ID"/>
      </ns2:container>
    </tt:cond>

    <tt:cond s-check="not-initial(ref('.telegram.PALLET_ID'))">
      <ns3:container>
        <tt:attribute name="pallet-id" value-ref=".telegram.PALLET_ID"/>
      </ns3:container>
    </tt:cond>


</top_element>
</tt:template>

之后应该是这样的:

<top_element
xmlns:ns1="xsd/namespacesForBoxes"
xmlns:ns2="xsd/namespacesForCartons"
xmlns:ns3="xsd/namespacesForPallets">
  <ns1:container box-id="BOX"/>
  <ns2:container carton-id="CARTON"/>
  <ns3:container pallet-id="PALLET"/>
</top_element>

“tt:cond”只是为了让丢失的 XML 标签或不同顺序的标签不会扰乱你的转换。

© www.soinside.com 2019 - 2024. All rights reserved.