reparing XML Namespaces without breaking existing content

Hello W3C community,

[Gregory Rosmaita recommended I send this suggestion to these lists.]

There has recently been extended discussion of namespaces within the  
HTML WG and other WGs and I'd like to suggest these are some issues  
that can be fixed even now in a backwards and forwards compatible  
manner.

What I'm suggesting is this:

• unprefixed attributes should be added to parent elements in the  
same  namespace as the parent element (unprefixed attributes are then  
understood as scoped to the namespace of their parent element)
• DOM manipulation of attributes should ensure that when methods do   
not specify a namespace, the method should infer the namespace of the   
parent element of the attribute (attributes without parent elements
and without a namespace specified would be in the null namespace)
• CSS3 selectors (still in draft status) would be reconceptualized to  
match the newly repaired XML namespaces so that using the example from
• Similar changes would need to be made for XPath, XQuery and any  
other specification that assumes unprefixed attributes in a compound  
document are in the null namespace.

The key here is to
  • treat unprefixed attributes as scoped to the namespace of their  
parent element
  • ensure DOM methods that manipulate attributes cause attributes  
without a namespace specified to inherit the namespace of the parent  
element to which they're attached
  • re-conceptualize the other recommendation/specifications that deal  
with namespaces to change their unprefixed attribute treatment to one  
of a scoped namespace for the attribute and not a null namespace for  
the attributes.


a CSS3 draft example[1]:
>
> CSS examples:
>
> @namespace foo "http://www.example.com";
> [foo|att=val] { color: blue }
> [*|att] { color: yellow }
> [|att] { color: green }
> [att] { color: green }
>
> The first rule will match only elements with the attribute att in
> the "http://www.example.com" namespace with the value "val".
>
> The second_AND FOURTH_ rule will match only elements with the
> attribute att regardless of the namespace of the attribute
> (including no declared namespace).
>
> The _THIRD RULE_ will match only elements with the attribute att
> where the attribute is not declared to be in a namespace.

These CSS selectors could be changed slightly to be more consistent  
with the current CSS3 selectors draft, however, I think making [att]  
select attributes regardless of namespace will break less content and  
confuse fewer authors than making [att] select only on attributes  
whose namespace is the same as their parent (which would be another  
way to go more consistent with the current CSS3 draft).

Making these changes would mean the repair of XML namespaces. It would  
also mean that virtually no existing content would break. I really  
don't see any downsides, except the few DOM authors effected by   
iteration looking for null namespace attributes that are now no longer  
null, however in that case the author should probably already be  
looking for both unprefixed and prefixed attributes with the parent  
elemnet’s namespace for thoroughness (which is the problem this  
fixes). The upside is that authors can now fully mix vocabularies —  
including attributes where appropriate — and not end up with those  
attributes in two separate namespaces though derived from the same  
vocabulary (null and the document’s specified namespace for the  
vocabulary).

This would have one drawback caused by needing to provide legacy  
compatibility, but it is a small or insignificant one as far as I can  
tell. There would be no way to use the DOM to create null namespaced  
attributes and then attach those attributes to non-null namespaced  
elements. So this would be made impossible:

<root-element
xmlns='http://www.example.com/first-vocabulary'
xmlns:second='http://www.example.com/second-vocabulary'
xmlns:third='http://www.example.com/third-vocabulary'
xmlns:null=''
 >
...
<an-element null:attribute='value' attribute='value' />
<third:another-element second:attribute='value' attribute='value' >
</third:element>
...
</root-element>

In this example, the 'another-element' element is in the 'third- 
vocabulary' namespace. Likewise the unprefixed 'attribute' attribute  
is also in the 'third-vocabulary' namespace. However, the previous  
element 'an-element' is in the default namespace ('first-vocabulary').  
The 'null' prefixed attribute is in the null namespace. Under this  
proposal to fix XML namespace, there would be no way to use the DOM to  
put such a null namespaced attribute on an element that was not itself  
in the null namespace. I don't think that is a serious problem because  
I don't think authors should be creating compound documents with  
universal attributes set to be in the null namespace. If it was  
considered a serious problem, then I think a way could be found for  
non-legacy implementations to accomplish this.

Take care,
Rob

[1]: <http://www.w3.org/TR/2005/WD-css3-selectors-20051215/#attrnmsp>

Received on Wednesday, 28 May 2008 18:09:31 UTC