← Prev in month
← Prev in thread
JAXP's ID Transform failing to include namespace declaration attributes
I've hit an unclear spot in the JAXP specification regarding the behavior of ID transforms. I think one thing should be happening and I know something else is happening but I'm not absolutely clear on whether or not I'm right. Clarification would be appreciated. Suppose we want to use DOM and JAXP to produce the following document or its equivalent, modulo white space and other insignificancies: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> <svg xmlns="http://www.w3.org/2000/svg"/> I claim the following code should do the trick, given that impl is a DOMImplementation object: // Create the document DocumentType svgDOCTYPE = impl.createDocumentType( "svg", "-//W3C//DTD SVG 1.0//EN", "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" ); Document doc = impl.createDocument( "http://www.w3.org/2000/svg", "svg", svgDOCTYPE); // Serialize the document onto System.out TransformerFactory xformFactory = TransformerFactory.newInstance(); Transformer idTransform = xformFactory.newTransformer(); Source input = new DOMSource(doc); Result output = new StreamResult(System.out); idTransform.transform(input, output); However, what this in fact produces is <?xml version="1.0" encoding="UTF-8"?> <svg/> There are two problems here: 1. The namespace is lost on the svg element. 2. The DOCTYPE declaration is lost. The details are a little implementation dependent. SAXON and Xalan-J both give these results. However, Gnu JAXP can mask it because it has a bug that cancels out this bug. I think both of these are problems with the idTransform. According to the JAXP specification, p. 62, "If all that is desired is the simple identity transformation of a source to a result, then TransformerFactory90 provides a newTransformer()93 method with no arguments. This method creates a Transformer that effectively copies the source to the result. This method may be used to create a DOM from SAX events or to create an XML or HTML stream from a DOM or SAX events." This is less than perfectly clear on issues like whether it should insert namespace attributes as necessary or include the DOCTYPE declaration. However, I think that what's actually output really doesn't strike me as a copy of the source to the result because a lot of significant information has been lost. Yes, I know that I could add the xmlns attribute, at least, manually. However, I think this should be closer to the default behavior of XMLSerializer where namespace declaration attributes are inserted automatically in the stream as necessary. -- +-----------------------+------------------------+-------------------+ | Elliotte Rusty Harold | | Writer/Programmer | +-----------------------+------------------------+-------------------+ | The XML Bible, 2nd Edition (Hungry Minds, 2001) | | http://www.ibiblio.org/xml/books/bible2/ | | http://www.amazon.com/exec/obidos/ISBN=0764547607/cafeaulaitA/ | +----------------------------------+---------------------------------+ | Read Cafe au Lait for Java News: http://www.cafeaulait.org/ | | Read Cafe con Leche for XML News: http://www.ibiblio.org/xml/ | +----------------------------------+---------------------------------+
← Prev in month
← Prev in thread