- From: Philippe Le Hegaret <plh@w3.org>
- Date: Mon, 05 Jan 2004 14:14:21 -0500
- To: Robin Berjon <robin.berjon@expway.fr>
- Cc: WWW DOM <www-dom@w3.org>
On Tue, 2003-12-09 at 09:57, Robin Berjon wrote:
> Hi,
>
> setAttributeNS() and friends with similar parameters has text to stricly
> forbid a qName with a prefix for a null nsURI, but nothing on whether it
> is legal to use it with a defined nsURI, and a qName that doesn't
> contain a prefix part.
The definition of qualified name, according the DOM glossary:
[[
A qualified name is the name of an element or attribute defined as the
concatenation of a local name (as defined in this specification),
optionally preceded by a namespace prefix and colon character.
]]
http://www.w3.org/TR/2003/CR-DOM-Level-3-Core-20031107/glossary.html#dt-qualifiedname
A qName may therefore contain a prefix when used with setAttributeNS().
> Most implementations seem to accept it, and then fail to serialise it
> properly. Some rightfully complain that you can't have a namespace URI
> on an attribute that doesn't have a prefix. This is a sorry state of
> affairs :)
>
> So it would be nice to see it resolved either way: either it is clearly
> flagged as an error, or it is clearly allowed, with indication of how
> the implementation may produce the prefix (not overwriting the one of
> that attribute if it exists, using a prefix in scope if there's one,
> generating one).
Your case is a serialization issue. DOM Level 3 Core doesn't say
anything about the serialization of a DOM tree but it does have an
algorithm to do namespace fix-up, which is also used by the LSSerializer
of DOM Level 3 Load and Save, to deal with your case:
[[
if ( Attr[i] has a namespace URI )
{
if ( attribute has no prefix (default namespace decl does not apply to attributes)
OR [...])
{
if (namespaceURI matches an in scope declaration of one or more prefixes)
{
// pick the most local binding available;
// if there is more than one pick one arbitrarily
==> change attribute's prefix.
}
else
{
if (the current prefix is not null and it has no in scope declaration)
{
==> declare this prefix
}
else
{
// find a prefix following the pattern "NS" +index (starting at 1)
// make sure this prefix is not declared in the current scope.
// create a local namespace declaration attribute
==> change attribute's prefix.
}
}
}
]]
http://www.w3.org/TR/2003/CR-DOM-Level-3-Core-20031107/namespaces-algorithms.html
In other words, it is not an error, and a new prefix will be generated
and declared by the implementation if necessary.
Philippe
Received on Monday, 5 January 2004 14:14:27 UTC