Re: namespace node implementation

Per Bothner wrote:
> * Each element has a "namespace mapping", which maps prefixes to uris, 
> and which can be implemented as a hash-table or a vector (propery-list). 
>   (Since the namespace mapping is primarily used for serialization, it 
> makes more sense to use a space-efficient vector.)
> * Once created a namespace mapping is immutable, and so can be shared 
> between element nodes.
> * When parsing an XML document, if an element has no namespace 
> attributes we re-use the namespace mapping of its parent.  If it has 
> namespace attributes, we create a new namespace mapping which is the 
> combination of the parent's namespace mapping with the new namespace 
> attributes.
> * When serializing an element, we print all the namespaces in the 
> element's namespace mapping, except for ones that are redundant because 
> they have already been serialized in an enclosing element.
> * When an element is constructed, its namespace mapping includes all the 
> "active namespaces nodes" (in the sense of the specification) plus any 
> of the namespaces in the prologue or predefined that are referenced in 
> the current element *or* (if this is a direct element constructor) in 
> any enclosed direct element constructors.  (This rule is meant to 
> minimize the number of distinct namespace mapping we have to create. 
> The implemengtatin may need to be a little bit clever here.)
> * When an element is (conceptually) copied (re-parented), we use its 
> existing namespace mapping.  We do *not* create a new namespace mapping 
> to incorporate any namespace in the parent.
> 

this is roughly speaking the way it works in Qizx (my own engine),
and probably in others.
some remarks:

- when copying an existing node into a constructed tree, there is a choice about
   copying in-scope prefix/ns mappings (aka "namespace nodes"):
	1- copy all in-scope mappings: more verbose output but
	   better chances to avoid creating synthetic namespace
	   declarations (something like xmlns:ns1="...") required by missing mappings.
	2- copy only mappings defined on the node itself: more concise
	3- copy no mappings at all: wont result in nice serialization
	4- copy only if used in sub-tree: best but not efficient

    currently Qizx takes the option 2, but now I think it would be better
    to switch to the 1.

- namespace/prefix pairs defined in the prologue are not actually copied onto nodes
   but they are used as hints or "preferred prefixes" for serialization.


-- 
Xavier FRANC

Received on Wednesday, 22 October 2003 07:14:49 UTC