Re: [xsl] exclude-result-prefixes not removing the xmlns attribute in the root element

Subject: Re: [xsl] exclude-result-prefixes not removing the xmlns attribute in the root element
From: andrew welch <andrew.j.welch@xxxxxxxxx>
Date: Tue, 3 Jan 2006 11:01:29 +0000
On 1/3/06, Juergen Donnerstag <juergen.donnerstag@xxxxxxxxx> wrote:
> I need to remove the xmlns attribute from the root tag of the output.
> From various docs I understood that the xsl processor inserts it
> automatically and by means of exclude-result-prefixes it can be
> removed. In my case however the
> xmlns:wicket="http://wicket.sourceforge.net"; attribute is already part
> of the root tag of the input and it seems to me
> exclude-result-prefixes="wicket" does not remove it. The output
> actually is the same; with and without exclude-result
> prefixes="wicket".
>
> The xsl sheet I'm using:
> <?xml version="1.0" encoding="ISO-8859-1"?>
>
> <xsl:stylesheet version="1.0"
>         xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>         xmlns:wicket="http://wicket.sourceforge.net";
>         exclude-result-prefixes="wicket">
>
> <xsl:output method="xml" omit-xml-declaration="yes"/>
>
> <!--  Just copy everything. This is basically the same as xsl:copy-of -->
> <xsl:template match="/ | @* | node()">
>   <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy>
> </xsl:template>
>
> </xsl:stylesheet>
>
> and the input:
>
> <span xmlns:wicket="http://wicket.sourceforge.net";
> wicket:id="test4"><span wicket:id="myBorder2"
> testAttr="myValue"><wicket:border>before body -
> <wicket:body>border</wicket:body> - after
> body</wicket:border></span></span>
>
> Any idea on how to remove xmlns:wicket from the output? Your help is
> very much appreciated. Thanks

In 2.0 you can use copy-namespaces="no"

In 1.0, the namespace and element name are fixed together, the only
way to 'remove' it is to create a new element in no namespace, so
modify your identity transform to be:

<xsl:template match="*">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates select="@*|*"/>
  </xsl:element>
</xsl:template>

<xsl:template match="@*">
	<xsl:attribute name="{local-name()}">
		<xsl:value-of select="."/>
	</xsl:attribute>
</xsl:template>

cheers
andrew

Current Thread