Keith
Keith

Reputation: 11

XSLT transformation of an XML message - beginner

I am looking to transform XML1 to XML2 (bascially adding additional namespaces & ).

I have been told this can be done via XSLT. Is this achieveable using XSLT and how simple (or complex) is it?

XML1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Update_WCS_OrderStatus SYSTEM "Update_WCS_OrderStatus_20.dtd" >
<Update_WCS_OrderStatus>
<ControlArea>
      <Verb value="Constant">test</Verb>
      <Noun value="Constant">Constant</Noun>
      <Credentials>
         <LogonId>a</LogonId>
         <Password>b</Password>
      </Credentials>
   </ControlArea>
   <DataArea>
     <OrderStatus>
         <OrderStatusHeader>
             <OrderNumber/>
               </OrderStatusHeader>
               <OrderStatusItem>
                 <ItemNumber/>
               </OrderStatusItem>
            </OrderStatus>
         </DataArea>
</Update_WCS_OrderStatus>'

XML2
'<?xml version="1.0" encoding="UTF-8"?>
<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
   <ns0:Message1>
    <!DOCTYPE Update_WCS_OrderStatus SYSTEM "Update_WCS_OrderStatus_20.dtd" >
      <Update_WCS_OrderStatus>
         <ControlArea>
            <Verb value="">Constant</Verb>
            <Noun value="">Constant</Noun>
            <Credentials>
               <LogonId>test</LogonId>
               <Password>test</Password>
            </Credentials>
         </ControlArea>
         <DataArea>
            <OrderStatus>
               <OrderStatusHeader>
                  <OrderNumber/>
               </OrderStatusHeader>
               <OrderStatusItem>
                  <ItemNumber/>
               </OrderStatusItem>
            </OrderStatus>
         </DataArea>
      </Update_WCS_OrderStatus>
   </ns0:Message1>
</ns0:Messages>

Upvotes: 1

Views: 362

Answers (1)

Martin Honnen
Martin Honnen

Reputation: 167716

You can't have a DOCTYPE node inside of an element node. Other than that you can of course achieve the task with XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

<xsl:template match="@* | node()">
  <xsl:copy>
     <xsl:apply-templates select="@* | node()"/>
   </xsl:copy>
</xsl:template>

<xsl:template match="/">
  <ns0:Messages>
    <ns0:Message1>
      <xsl:apply-templates/>
    </ns0:Message1>
  </ns0:Messages>
</xsl:template>

<xsl:template match="ControlArea/Verb[@value = 'Constant'] | ControlArea/Noun[@value = 'Constant']">
  <Verb value="">Constant</Verb>
</xsl:template>

</xsl:stylesheet>

Upvotes: 1

Related Questions