RE: [xsl] Is it possible to set the default namespace with a dynamically-generated namespace uri?

Subject: RE: [xsl] Is it possible to set the default namespace with a dynamically-generated namespace uri?
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sat, 13 Mar 2010 07:10:51 -0000
You need to create elements and attributes with the correct expanded name at
the time you create them. If that means using xsl:element, so be it.
xsl:namespace can only be used to create additional namespace nodes to those
that are created automatically for the prefixes/uris used in element and
attribute names; it can't be used to modify the name of an element or
attribute node.

As always, to understand this you need to understand the data model for
namespaces. An element/attribute name is a triple, containing (prefix, uri,
localname). A namespace node is a pair (prefix, uri). There is a consistency
rule that if an element or attribute name exists containing prefix=P uri=U
then there must be a namespace node (P, U). The namespace fixup process
ensures that this namespace node is created automatically when you create an
element or attribute. xsl:namespace is there to allow you to create
additional namespace nodes, typically for namespaces used in QName-valued
content.

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay

> -----Original Message-----
> From: Dimitre Novatchev [mailto:dnovatchev@xxxxxxxxx]
> Sent: 12 March 2010 23:45
> To: David Carlisle
> Cc: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Is it possible to set the default
> namespace with a dynamically-generated namespace uri?
>
> > <xsl:element name="foo" namespace="$x"
> >
> > is your friend
> >
> > david
>
> Yes, but this would require creating all the output with <xsl:element>
>
> The OP (in another forum) wants this default namespace to
> apply to literal result elements that are descendents of this
> top node.
> However, they are just copied to the output 1:1 and the
> serializer takes special care to express the fact that they
> belong to no
> namespace, by inserting "  xmlns=''     " on all of them.
>
> It seems to me that using <xsl:namespace> it is not possible
> to specify a default namespace.
>
> I would be very glad if someone provides a concrete code
> sample proving me wrong :)
>
> Cheers,
> Dimitre
>
>
>
>
> On Fri, Mar 12, 2010 at 11:26 AM, David Carlisle
> <davidc@xxxxxxxxx> wrote:
> > On 12/03/2010 19:15, Dimitre Novatchev wrote:
> >>> http://www.w3.org/TR/xslt20/#element-namespace
> >>>
> >>> If the effective value  of the name attribute is a zero-length
> >>> string, a namespace node is added for the default namespace.
> >>>
> >>>
> >>> so
> >>>
> >>> <foo>
> >>> <xsl:namespace name="" select="$x"/>
> >>>
> >>> sets the default namespace to the uri in the variable x.
> >>>
> >>> David
> >>
> >>
> >>
> >> David, I tried this hours before asking the question.
> >>
> >> Saxon raises this error:
> >
> > er because I got it wrong, sorry, I should have checked or known or
> > something.
> >
> > You can add namespace nodes using xsl:namespace but you
> can't change
> > the namespace of a node that's already  been created so <foo>
> > <xsl;namespace name=""
> >
> >
> > doesn't work.
> >
> >
> > <xsl:element name="foo" namespace="$x"
> >
> > is your friend
> >
> > david
> >
> >
> >
>
>
>
> --
> Cheers,
> Dimitre Novatchev
> ---------------------------------------
> Truly great madness cannot be achieved without significant
> intelligence.
> ---------------------------------------
> To invent, you need a good imagination and a pile of junk
> -------------------------------------
> Never fight an inanimate object
> -------------------------------------
> You've achieved success in your field when you don't know
> whether what you're doing is work or play
> -------------------------------------
> I enjoy the massacre of ads. This sentence will slaughter ads
> without a messy bloodbath.

Current Thread