xsl-list
[Top] [All Lists]

RE: Getting rid of xmlns="" attributes

2003-12-31 11:04:36
The system has inserted an xmlns="" namespace declaration because you
have asked for the <exportTimeStamp> element to go in the null
namespace. If you don't want this namespace declaration, then presumably
you actually want the exportTimeStamp element to be in the namespace
http://tempuri.org/FormSchema.xsd. However, you are producing this
element as a copy of an element in the source document, and presumably
the element in the source document was in the null namespace. When you
copy an element from the source document, you can't change its namespace
- copy really does mean "copy exactly". If you want to change the
namespace of an element, use <xsl:element name="{local-name()}"
namespace="http://tempuri.org/FormSchema.xsd";>.

Remember that you control, from the stylesheet, the namespace in which
new elements are created. The serializer then produces namespace
declarations to reflect this. Usually, if you aren't happy with the
namespace declarations in the output, it's because you are creating
elements in the wrong namespace.

Michael Kay

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com 
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
Allen, Erik
Sent: 30 December 2003 23:23
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Getting rid of xmlns="" attributes


      I've been using XSL for a few months now and I've been 
given a request for a transformation of our XML document into 
another XML document, with only some slight changes. One of 
the changes is to remove a xml:space="preserve" attribute, 
but I consider that a trivial problem that I can easily 
solve. (I'm just explicitly writing the element with the two 
other attributes that appear.) The bigger problem is that I 
need to add two namespaces to the XML.
      From what I've read on this list, the best place to do 
something like that is to place the namespace definitions 
within the <xsl:stylesheet> element. I've done that, but now 
all the child elements have xmlns="" appearing within them. 
My XSL looks like this:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
                      xmlns="http://tempuri.org/FormSchema.xsd";
      
xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance";
                      version = '1.0'>

<xsl:output method="xml"/>

<xsl:template match="/template">
      <template>
              <xsl:attribute name="version">
                      <xsl:value-of select="@version"/>
              </xsl:attribute>
              <xsl:attribute name="readVersion">
                      <xsl:value-of select="@readVersion"/>
              </xsl:attribute>
              <xsl:copy-of select="*"/>
      </template>
</xsl:template>

</xsl:stylesheet>

      The transformation appears to work fine, except, as I 
said, the child elements of the root <template> element, all 
have the attribute xmlns="". A short snippet of it would be this:

<?xml version="1.0" encoding="utf-8"?>
<template xmlns="http://tempuri.org/FormSchema.xsd";
xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance"; 
version="3" readVersion="3">
  <exportTimeStamp xmlns="">
    <date>2003-12-29</date>
    <time>15:31:34</time>
  </exportTimeStamp>
  <templateInfo xmlns="" name="" id="1139410602" revision="1">
    ...
  </templateInfo>
  ...
</template>

      I've found that if I change the namespace in the 
<xsl:stylesheet> from xmlns to xmlns:y, then I don't get the 
rogue attribute, but that is also giving me the incorrect 
namespace. The source XML does not have any namespaces 
defined within it, and I think that I read somewhere that the 
<xsl:copy-of> might have issues with that. 
      Is there anyway to get the namespaces to come out 
correctly, without giving me the xmlns=""?

      Erik Allen



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



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