[XML-SIG] cannot change xmlns:xsi

Andrew Clover and-xml at doxdesk.com
Thu Dec 2 16:35:47 CET 2004


Daniel Isenegger <disen at geo.unizh.ch> wrote:

> node.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")

setAttribute is a Level 1 method and thus namespace-ignorant. The above 
should probably work as long as there is already an xmlns:xsi attribute 
on 'node', but if there isn't it'll create a new one as a Level 1 node, 
without a namespace. This is just one of the many problems when mixing 
namespace-aware and namespace-ignorant methods. Really you want:

   XMLNS= 'http://www.w3.org/2000/xmlns/'
   XSINS= 'http://www.w3.org/2001/XMLSchema-instance'
   node.setAttributeNS(XMLNS, 'xmlns:xsi', XSINS)

However...

In DOM Level 2, the namespaceURI of an Element or Attr is considered 
part of its identity, not dynamically recalculated. So, given:

   <a xmlns:q="spam">
     <q:b/>
   </a>

you can change the value of the xmlns:q attribute to 'eggs', but the 
namespaceURI of the q:b element is still 'spam'.

Quite what DOM Level 2 implementations are supposed to do with the 
problem during output of the document is unspecified, as DOM Level 2 
says nothing about IO.

But DOM Level 3 LS does. It uses "namespace fixup" to ensure all 
namespaceURIs survive the output process. You would end up with:

   <a xmlns:q="eggs">
     <q:b xmlns:q="spam"/>
   </a>

Therefore correcting the value of the namespace declaration on the root 
element won't help much; all its descendants would still have the wrong 
('...w3c...') namespace. You would have to walk over the whole document 
tree using DOM Level 3's Document.renameNode method to change all their 
namespaces.

The alternative would be to use a completely namespace-ignorant DOM 
implementation. For a DOM Level 3 implemenation you can request this by 
setting the domConfig parameter 'namespaces' to False.

However (again)...

> the attribute is temporally set to ...w3... and then reset to ..w3c...

Having said all that... minidom is not a DOM Level 3 implementation. It 
doesn't do namespace fixup at all. Its toxml() method just outputs 
attributes as they are, so it shouldn't be putting the '...w3c...' 
namespace in anywhere.

So it must be some other tool or part of the program that is having this 
effect.

-- 
Andrew Clover
mailto:and at doxdesk.com
http://www.doxdesk.com/


More information about the XML-SIG mailing list