xsl-list
[Top] [All Lists]

Re: [xsl] Removing unwanted namespaces

2012-01-11 11:35:48
Ram,

It will look something like this (XSLT 2.0):

<xsl:template match="*">
  <xsl:copy copy-namespaces="no">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="soapenv:Header/*"/>

However, note that while this meets your requirement as stated, it does not provide declarations at the top for all namespaces in use, which you probably want. This is somewhat trickier.

Assuming your input maps namespaces to prefixes one-to-one, you could address that problem like this:

<xsl:template match="/*">
  <xsl:copy copy-namespaces="no">
    <xsl:copy-of select="@*"/>
    <xsl:for-each-group select="//*" group-by="namespace-uri(.)">
      <xsl:namespace name="{prefix-from-QName(node-name(.))}">
        <xsl:value-of select="current-grouping-key()"/>
      </xsl:namespace>
    </xsl:for-each-group>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

You might want to check this paper out (or at any rate, the stylesheets bundled with it, which offer more comprehensive solutions to namespace problems):

http://www.ncbi.nlm.nih.gov/books/NBK62086/

I hope this helps,
Wendell

On 1/11/2012 10:55 AM, ram wrote:
Hi,
    I have a soap request which contains header and body information. I want to 
remove the content inside the header and the namespaces for those which are 
inside the  header .
   Here is my example

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:con="http://abcd.com/abc/context"; 
xmlns:dat="http://test.com/test/testContracts"; xmlns:head="http://abcd.com/abc/header"; 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";>
        <soapenv:Header>
                <head:abcdHeader>
                        <head:Props>
                                
                        </head:Props>
                        <head:Routing>
                                
                        </head:Routing>
                </head:abcdHeader>
                <con:Context>
                        <con:CtxProps>
                                context info
                        </con:CtxProps>
                </con:Context>
        </soapenv:Header>
        <soapenv:Body>
                Body content
        </soapenv:Body>
</soapenv:Envelope>


The output i am expecting is like below
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:dat="http://test.com/test/testContracts";  
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";>
        <soapenv:Header>
                
        </soapenv:Header>
        <soapenv:Body>
                Body content
        </soapenv:Body>
</soapenv:Envelope>


    I tried the following xslt code which removes the Header Info, but it still 
keeping the namespaces which references the ones inside the  header.


        <xsl:template match="@*|node()">
                <xsl:copy>
                        <xsl:apply-templates select="@*|node()"/>
                </xsl:copy>
        </xsl:template>
        <xsl:template match="//*[local-name()='abcdHeader'] ">
                
                </xsl:template>
        <xsl:template match="//*[local-name()='Context'] "/>    


The output that i am getting

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:dat="http://test.com/test/testContracts";
xmlns:head="http://abcd.com/abc/header";
xmlns:con="http://abcd.com/abc/context";
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";>
        <soapenv:Header>
                
        </soapenv:Header>
        <soapenv:Body>
                Body content
        </soapenv:Body>
</soapenv:Envelope>

    i dont want to header and context namesspaces in the output. How to fix 
this issue.

--kk




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--
======================================================================
Wendell Piez                            
mailto:wapiez(_at_)mulberrytech(_dot_)com
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--