It's really a DOM-style implementation, and the namespace
axis just goes
up the tree and gathers up the nodes. So, this breaks when
you really on
generate-id() as a hack to implement node identity, and also
in the case,
where you use the parent axis. In the first case, there's no
work-around,
while in the second case, there is.
Saxon, as a matter of interest, does exactly the same thing internally,
but
when you use the namespace axis explicitly it creates a transient
namespace
node with the right parent pointer. This is sufficiently rare that the
cost
hardly matters.
My initial intention was to do the same thing in Xalan-C. However, I was
worried that tracking the lifetime of the nodes would be expensive. Also,
having transient nodes could affect API users because they would end up
with node-sets containing nodes that were not in the initial source tree
and had a potentially different lifetime.
I'm just happy that XPath 2.0 has given implementers the wiggle room to
get rid of namespace nodes altogether.
Dave