Andreas Veithen created XERCESJ-1586:
----------------------------------------

             Summary: lookupNamespaceURI may return unexpected result when 
looking up default namespace
                 Key: XERCESJ-1586
                 URL: https://issues.apache.org/jira/browse/XERCESJ-1586
             Project: Xerces2-J
          Issue Type: Bug
          Components: DOM (Level 3 Core)
    Affects Versions: 2.9.1
            Reporter: Andreas Veithen
            Priority: Minor


Consider the following XML document:

<root xmlns="urn:test"><child xmlns=""/></root>

Assume that the document is constructed programmatically without explicitly 
adding the namespace declarations:

        Document document = 
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
        Element root = document.createElementNS("urn:test", "root");
        document.appendChild(root);
        Element child = document.createElementNS(null, "child");
        root.appendChild(child);

The expectation is that when looking up the default namespace on the child 
element, the result is null. However, this is not the case, as demonstrated by 
the following code:

        System.out.println("uri=" + child.lookupNamespaceURI(null));

In fact, the output is:

        uri=urn:test

Moreover, the result changes after normalizing the document:

        document.normalizeDocument();
        System.out.println("uri=" + child.lookupNamespaceURI(null));

The output with Xerces 2.9.1 is now (Note that the result is still not correct 
because one would expect uri=null, but this has been fixed in recent Xerces 
versions; see XERCESJ-1394):

        uri=

The reason is that normalizeDocument adds xmlns="" to the child node (as 
expected).

Actually, the behavior of lookupNamespaceURI shown here strictly conforms to 
the DOM Level 3 Core specification, as described in appendix B.4. That is 
because of the namespace != null condition in the following part of the pseudo 
code:

         if ( Element's namespace != null and Element's prefix == prefix ) 
         { 
               // Note: prefix could be "null" in this case we are looking for 
default namespace 
               return (Element's namespace);
         } 

However, if one strictly follows the specification, then normalizeDocument 
should also not add xmlns="" to the child element. In fact, the action taken by 
normalizeDocument to fixup the namespace of that element is described by the 
following part of the pseudo code in appendix B.1:

      // Element has no pseudo-prefix
      if ( there's a conflicting local default namespace declaration
           already present )
      {
        ==> change its value to use this empty namespace.

      }
      // NOTE that this may break other nodes within this Element's
      // subtree, if they're already using the default namespaces.
      // They will be repaired when we reach them.

Since there is no conflicting _local_ default namespace declaration on the 
child element, according to the specification, nothing should be done. This is 
obviously not what one wants in this case, and Xerces ignores that aspect of 
the specification. However, for consistency, Xerces should then also ignore the 
namespace != null condition in appendix B.4.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to