Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Private
  • Views: 57
  • Last Modified:

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
0
Pradeep0308
Asked:
Pradeep0308
  • 4
  • 2
1 Solution
 
Geert BormansCommented:
<?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

0
 
Pradeep0308Author Commented:
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
0
 
Geert BormansCommented:
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
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
Geert BormansCommented:
<?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()" mode="null-ns"/>
        </Message>
    </xsl:template>

    <xsl:template match="*" mode="null-ns">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="node()" mode="null-ns"/>
        </xsl:element>
    </xsl:template>
    
    <xsl:template match="node()[not(self::*)]" mode="null-ns">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
    
</xsl:stylesheet>

Open in new window

0
 
Pradeep0308Author Commented:
Geert,

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

Regards
Pradeep
0
 
Geert BormansCommented:
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
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now