Link to home
Start Free TrialLog in
Avatar of Pradeep0308
Pradeep0308Flag for India

asked on

XSLT Question

Hi,

We are sending the below SOAP response and there is a requirement where the <Message> needs to look like                                                <Message xmlns="">

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<soapenv:Body>
		<StockAdjustmentMsg xmlns="http://www.abc-def.com/ns/schema">
			<Message>
				<Header>
					<ApiVersion>1.0.1</ApiVersion>
					<CreationTime>2014-07-18T11:30:17</CreationTime>
					<SenderId>ABCD</SenderId>
					<SenderAuth>18a51609-6ae2-4ea7-b5bd-bc8806fd</SenderAuth>
					<ReceiverId>DEF</ReceiverId>
					<MessageType>STOCK_ADJUSTMENT</MessageType>
				</Header>
				<Body>
					<MessageId>20140718113017_</MessageId>
					<StockAdjustment>
						<ProductNr>60000000006902</ProductNr>
						<Quantity>6</Quantity>
						<StockTypeTo>NEW</StockTypeTo>
						<Reason>510</Reason>
					</StockAdjustment>
				</Body>
			</Message>
		</StockAdjustmentMsg>
	</soapenv:Body>
</soapenv:Envelope>

Open in new window


Note that the XSLT needs to be general as StockAdjustmentMsg can also be different like OrderMsg etc. Also Body can repeat.

Thanks
Pradeep
Avatar of Gertone (Geert Bormans)
Gertone (Geert Bormans)
Flag of Belgium image

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    
    <xsl:template match="node()">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
                <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[local-name() = 'Message']">
        <Message>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="node()"/>
        </Message>
    </xsl:template>
</xsl:stylesheet>

Open in new window

Avatar of Pradeep0308

ASKER

Geert,

The output of the XSLT is below:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<soapenv:Body>
		<StockAdjustmentMsg xmlns="http://www.abc-def.com/ns/schema">
			<Message xmlns="">
				<Header xmlns="http://www.abc-def.com/ns/schema">
					<ApiVersion>1.0.1</ApiVersion>
					<CreationTime>2014-07-18T11:30:17</CreationTime>
					<SenderId>ABCD</SenderId>
					<SenderAuth>18a51609-6ae2-4ea7-b5bd-bc8806fd</SenderAuth>
					<ReceiverId>DEF</ReceiverId>
					<MessageType>STOCK_ADJUSTMENT</MessageType>
				</Header>
				<Body xmlns="http://www.abc-def.com/ns/schema">
					<MessageId>20140718113017_</MessageId>
					<StockAdjustment>
						<ProductNr>60000000006902</ProductNr>
						<Quantity>6</Quantity>
						<StockTypeTo>NEW</StockTypeTo>
						<Reason>510</Reason>
					</StockAdjustment>
				</Body>
			</Message>
		</StockAdjustmentMsg>
	</soapenv:Body>
</soapenv:Envelope>

Open in new window

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
            <StockAdjustmentMsg xmlns="http://www.abc-def.com/ns/schema">
                  <Message xmlns="">
                        <Header xmlns="http://www.abc-def.com/ns/schema">
                              <ApiVersion>1.0.1</ApiVersion>
                              <CreationTime>2014-07-18T11:30:17</CreationTime>
                              <SenderId>ABCD</SenderId>
                              <SenderAuth>18a51609-6ae2-4ea7-b5bd-bc8806fd</SenderAuth>
                              <ReceiverId>DEF</ReceiverId>
                              <MessageType>STOCK_ADJUSTMENT</MessageType>
                        </Header>
                        <Body xmlns="http://www.abc-def.com/ns/schema">
                              <MessageId>20140718113017_</MessageId>
                              <StockAdjustment>
                                    <ProductNr>60000000006902</ProductNr>
                                    <Quantity>6</Quantity>
                                    <StockTypeTo>NEW</StockTypeTo>
                                    <Reason>510</Reason>
                              </StockAdjustment>
                        </Body>
                  </Message>
            </StockAdjustmentMsg>
      </soapenv:Body>
</soapenv:Envelope>

It is adding namespace to Header and Body also. I only need Message to look like <Message xmlns="">. Below is how I need the output to look like:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<soapenv:Body>
		<StockAdjustmentMsg xmlns="http://www.abc-def.com/ns/schema">
			<Message xmlns="">
				<Header>
					<ApiVersion>1.0.1</ApiVersion>
					<CreationTime>2014-07-18T11:30:17</CreationTime>
					<SenderId>ABCD</SenderId>
					<SenderAuth>18a51609-6ae2-4ea7-b5bd-bc8806fd</SenderAuth>
					<ReceiverId>DEF</ReceiverId>
					<MessageType>STOCK_ADJUSTMENT</MessageType>
				</Header>
				<Body>
					<MessageId>20140718113017_</MessageId>
					<StockAdjustment>
						<ProductNr>60000000006902</ProductNr>
						<Quantity>6</Quantity>
						<StockTypeTo>NEW</StockTypeTo>
						<Reason>510</Reason>
					</StockAdjustment>
				</Body>
			</Message>
		</StockAdjustmentMsg>
	</soapenv:Body>
</soapenv:Envelope>

Open in new window

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
            <StockAdjustmentMsg xmlns="http://www.abc-def.com/ns/schema">
                  <Message xmlns="">
                        <Header>
                              <ApiVersion>1.0.1</ApiVersion>
                              <CreationTime>2014-07-18T11:30:17</CreationTime>
                              <SenderId>ABCD</SenderId>
                              <SenderAuth>18a51609-6ae2-4ea7-b5bd-bc8806fd</SenderAuth>
                              <ReceiverId>DEF</ReceiverId>
                              <MessageType>STOCK_ADJUSTMENT</MessageType>
                        </Header>
                        <Body>
                              <MessageId>20140718113017_</MessageId>
                              <StockAdjustment>
                                    <ProductNr>60000000006902</ProductNr>
                                    <Quantity>6</Quantity>
                                    <StockTypeTo>NEW</StockTypeTo>
                                    <Reason>510</Reason>
                              </StockAdjustment>
                        </Body>
                  </Message>
            </StockAdjustmentMsg>
      </soapenv:Body>
</soapenv:Envelope>

Thanks
Pradeep
Actually you asked
<Message xmlns="">
which is mechanical to say that Message is NOT in the namespace of the higher up element it would inherit the default namespace from
(you are basically switching back to the null namespace for this element)

Now you ask to take out the entire Mesaage including children, to the null namespace
(note that you are making it different elements

the xmlns="" will not appear if the parent of Message is in the NULL namespace

Will post improved code in a minute
ASKER CERTIFIED SOLUTION
Avatar of Gertone (Geert Bormans)
Gertone (Geert Bormans)
Flag of Belgium image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Geert,

Many thanks. Could you explain me the last two template match what they are doing?

Regards
Pradeep
The first one gets triggered on the Message element and creates a new one but only using the local name (essentialy removing the namespace) and continues processing in a mode. The second one picks up all elements in that mode and removes the namespace for all of them