Unexpected namespace mappings using identity Transformer with DOM flavour
-------------------------------------------------------------------------
Key: XALANJ-2406
URL: https://issues.apache.org/jira/browse/XALANJ-2406
Project: XalanJ2
Issue Type: Bug
Components: DOM, Serialization
Reporter: Brian Minchau
Fix For: The Latest Development Code
This isn't exacly a bug, but it is against the serialization "philosophy".
The serializer stage tries to write out a minimal set of namespace mappings.
For example if <a> has child <b> and both elements have the namespace node that
maps prefix "prex" to URI "uri-x" then it tries to serializer the document as:
<a xmlns:prex='uri-x'><b/></a>
rather than as:
<a xmlns:prex='uri-x'><b xmlns:prex='uri-x' /></a>
It isn't that the second form is wrong, it is just that due to the XML standard
<b> inherits its parent namespace nodes or mappings. The problem with the
second form is that things can get pretty messy when there are a number of
namespace nodes and also a deep ancestor tree. Messy and potentially a
preformance problem with large (lots of characters) output XML.
Here is a testcase showing this problem:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.dom.DOMSource;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import java.io.*;
import java.util.Properties;
public class Test {
private static final String XML_SOURCE =
"<doc xmlns:foo='foo'>" +
"<a xmlns:foo='foo'/>" +
"</doc>";
public static void main(String[] args) throws Exception
{
DocumentBuilderFactory dfactory =
DocumentBuilderFactory.newInstance();
dfactory.setNamespaceAware(true);
DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
Node xmlDOM = docBuilder.parse(new InputSource(new
StringReader(XML_SOURCE)));
String key = "javax.xml.transform.TransformerFactory";
String value =
org.apache.xalan.processor.TransformerFactoryImpl.class.getName();
Properties props = System.getProperties();
props.put(key, value);
System.setProperties(props);
Transformer t = TransformerFactory.newInstance().newTransformer();
t.transform(new DOMSource(xmlDOM), new StreamResult(System.out));
}
}
Expected result:
<?xml version="1.0" encoding="UTF-8"?><doc xmlns:foo="foo"><a/></doc>
Actual result:
<?xml version="1.0" encoding="UTF-8"?><doc xmlns:foo="foo"><a
xmlns:foo="foo"/></doc>
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]