Alex Rivera | Logout

XSL - copy elements but remove unused namespace(s)

Asked 2009-07-02T14:37:18.633
18

I've got some XML which declares a namespace which is only used for attributes, like this:

<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:x="http://tempuri.com">
    <b>
        <c x:att="true"/>
        <d>hello</d>
    </b>
</a>

I want to use XSL to create a copy of selected nodes and their values - getting rid of the attributes. So my desired output is:

<?xml version="1.0" encoding="UTF-8"?>
<b>
    <c />
    <d>hello</d>
</b>

I've got some XSL that almost does this, but I can't seem to stop it putting the namespace declaration in the top level element of the output. My XSL is:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:apply-templates select="/a/b"/>
    </xsl:template>

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

The first element of the output is <b xmlns:x="http://tempuri.com"> instead of <b>. I've tried declaring the namespace in the XSL and putting the prefix in the exclude-result-prefixes list, but this doesn't seem to have any effect. What am I doing wrong?

UPDATE: I've found that by declaring the namespace in the XSL and using the extension-element-prefixes attribute works, but this doesn't seem right! I guess I could use this, but I'd like to know why the exclude-result-prefixes doesn't work!

UPDATE: Actually, it seems this extension-element-prefixes solution only works with XMLSpy's built-in XSLT engine, not with MSXML.

Edit
Report

1 Answer

2

This will remove the x namespace from output.

<xsl:namespace-alias result-prefix="#default" stylesheet-prefix="x" />

Remember to do two things when you deal with a default namespace. First map it into something in the stylesheet tag, and then remove it using a namespace-alias.

answered 2011-11-30T09:26:42.247

Your Answer