Re: [xsl] Unwanted (default) namespaces.

Subject: Re: [xsl] Unwanted (default) namespaces.
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Mon, 8 Jul 2002 21:34:41 +0100
Hi Ed,

> I have an XML file which I process with an XSL stylesheet to create
> another XSL stylesheet included by other XSL stylesheets. This was
> working until I decided to change our XML files to be within a
> namespace to avoid possible future maintenance/integration issues.
> When I made this change, a namespace started showing up on an HTML
> tag which was being copied from the XML file to the generated XSL
> file: <html:br\> became <html:br xmlns="http://fedex.com/gnsl"/>.
>
> Outside of eliminating my use of the default namespace in my source
> XML file, I have discovered no way to circumvent the inclusion of
> this unwanted "xmlns" attribute. I am using the XalanC++ 'Xalan' and
> 'testXSLT' XSL processors.
>
>    The source XML file has the following (truncated) content:
>    <TagLabels  xmlns:html="http://www.w3.org/1999/xhtml";
>                xmlns="http://fedex.com/gnsl"; >
>    <Tag name="GNSL_LOCATION_TYPE_CD">LOC<html:br/>TYPE</Tag>
>    </TagLabels>
>
> The XSL stylesheet declaration and the templates which output the
> offending statement follow:
>
>    <xsl:stylesheet version="1.0"
>    xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>                     xmlns:html="http://www.w3.org/1999/xhtml";
>                     xmlns:gnsl="http://fedex.com/gnsl";
>                     exclude-result-prefixes="gnsl html" >
[snip]

OK, the namespace node that's creating the namespace declaration that
you're seeing is the one in the source document. Your html:br element
in the source document has a namespace node associated the default
namespace with the namespace 'http://fedex.com/gnsl'. My guess is that
you're copying the html:br element in your document, with something
like:

<xsl:template match="html:*">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" />
  </xsl:copy>
</xsl:template>

When you copy an element, with xsl:copy or xsl:copy-of, you copy all
its namespace nodes as well. So rather than doing that, you need to
create an element without any associated namespace nodes, which means
that you have to use xsl:element. Try using:

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

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread