Re: [xsl] removing namespaces

Subject: Re: [xsl] removing namespaces
From: Garvin Riensche <g.riensche@xxxxxxx>
Date: Tue, 01 Apr 2008 21:22:55 +0200
I should have written "tiding up namespaces" instead of "removing" as I don't want to loose them. I just want to clean them up.

Maybe I am wrong but I thought that if the "method" element has the namespace "http://new.element";, all child elements will belong to this namespace too. So there's no need to write the namespaces of the child elements to the output.

The namespaces are as you proposed defined in the stylesheet element on top of the stylesheet:

<xsl:stylesheet version="2.0"
	xmlns:srcml="http://srcml.de";
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
	xmlns:srcml-new="http://new.element";
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
	xmlns:meta="http://srcml.de/meta";>
...

I don't really understand why the namespaces show up in the elements although they are declared on top of the stylesheet. And I am wondering where the xmlns="" comes from. It would just look nicer if I could get rid of the namespaces in the elements. If I use the Syntax srcml-new:modifiers in the template instead of just "modifiers" there is still the complete srcml-new namespace definition in the output.

regards,
Garvin

I'm not totally sure of what you mean by "hiding" a namespace, which is impossible. Either you remove it (which means you change the QName of the elements) or you leave it in. Cleaning up namespaces (putting there declarations on top of the XML) is possible by declaring the namespaces in the xsl:stylesheet declaration element (and I'm sure there are other ways, but I believe that's the way I did it). Then, all you need to do is use the prefixes in your element names:

<xsl:element name="myns:method">.... etc

using an AVT is also ok, as long as it resolves to an existing namespace.

Btw, your code is not complete and as it is, it is a bit misty for me why it creates the output you say it does (you do not show declarations for prefixes "scrcml" and "srcml-new" which are the ones you wanted out of your way because they were not used in all elements, right?).

Anyway, bottom line is: often it is easiest to declare namespaces as early as you can so that you have a clearer document to read.

Cheers,
-- Abel Braaksma



Garvin Riensche wrote:
Hello,

One more namespaces question:

I have this template:

<xsl:template name="addMethod">
  <xsl:element name="method" namespace="http://new.element";>
    <xsl:attribute name="name" select="$method_name"/>
    <xsl:attribute name="id" select="$method_id"/>
    <modifiers>
      <modifier name="{$modifier}"/>
    </modifiers>
    <type name="{$type}"/>
    <block>
      <expr>
        <return>
      <expr>
        <identifier name="{$variable_name}" idref="{$variable_id}"/>
      </expr>
    </return>
      </expr>
    </block>
  </xsl:element>
</xsl:template>

which produces the following output:

<method xmlns="http://new.element"; name="get_j" id="MB1;get_j()">
<modifiers xmlns:srcml-new="http://new.element"; xmlns="">
<modifier name="public"/>
</modifiers>
<type xmlns:srcml="http://srcml.de";
xmlns:srcml-new="http://new.element"; xmlns=""
name="int"/>
<block xmlns:srcml="http://srcml.de"; xmlns:srcml-new="http://new.element"; xmlns="">
<expr>
<return>
<expr>
<identifier name="j" idref="VCB1;#Cint;j;"/>
</expr>
</return>
</expr>
</block>
</method>


How do I hide the namespaces of the elements? Is the only possibility to add several xsl:exclude-result-prefixes="..." to the "modifiers", "type" and "block" elements? Or is there another solution?

regards,
Garvin

Current Thread