Re: xalan transform not working when passed the getDocumentElement()

Nathan Nadeau <[email protected]> Fri, 15 Oct 2010 12:01:40 -0400
Newsgroups gmane.text.xml.xalan.java.user
Organization Gleim Publications
Message-ID <[email protected]>
Sushant,

It looks like what's happening is you're confusing the root of the 
document (in xpath terms) with the root element (in XML spec terms), 
which is a common problem. Your template only matches the "/", which is 
the root of the document, which is NOT the same at the <html> root 
element, confusingly. Think of the Document object as being a wrapper 
around the actual XML document. The children of Document include the 
root of the XML input, <html>, and can also include comment and 
processing instruction nodes.

See http://www.dpawson.co.uk/xsl/sect2/root.html for a nice discussion.

In your #1 transform, you are sending the Document itself as input to 
the XSLT, which successfully matches "/", and does everything you 
expect. In your #2 transform, you are actually sending the <html> child 
of the Document as the input to the XSLT, and that no longer matches 
your "/" template. Since no explicit templates in your XSLT match the 
<html> element, the default XSLT templates kick in, which essentially 
print out text values of children elements.

I am not sure why you get the correct results if you don't specify XALAN 
however.

Nathan

Sushant Sinha wrote:
> I am trying to use xalan for XSLT transformation of XML files. However,
> I see different outputs when I invoke transform with the input source as
> DOMSource(org.w3.dom.Document doc)  than with the
> DOMSource(doc.getDocumentElement()). The output of the one with Document
> seems correct but the one with getDocumentElement omits any tags
> specified in the XSL file. I would like to know why we have problem with
> transform when we pass it the getDocumentElement()
>
> Here is a detailed example:
>
> XML FILE:
> =========================================
> <html>
>     <head>
>         <title> DOM </title>
>     </head>
>     <body> Learning Java Programming </body>
> </html>
>
>
> XSL FILE:
> =========================================
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> version="1.0">
>     <xsl:template match="/">
>          <item>
>              <title><xsl:value-of select="html/head/title"/></title>
>              <body><xsl:value-of select="html/body"/></body>
>          </item>
>     </xsl:template>
> </xsl:stylesheet>
>
> CODE
> =========================================
>
> DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
> factory.setIgnoringElementContentWhitespace(true);
> DocumentBuilder docbuilder = factory.newDocumentBuilder();
>
> Document doc = docbuilder.parse(xmlfilepath);
>
> TransformerFactory tFactory = TransformerFactory.newInstance();
> Transformer transformer = tFactory.newTransformer(new
> StreamSource(xslfile));
>
> DOMSource docSource1 = new DOMSource(doc);
> DOMSource docSource2 = new DOMSource(doc.getDocumentElement());
>
> #1. transformer.transform(docSource1, new StreamResult(System.out));
> #2. transformer.transform(docSource2, new StreamResult(System.out));
>
>
> With transform #1, we get 
> =========================================
> <?xml version="1.0" encoding="UTF-8"?><item><title> DOM </title><body>
> Learning Java Programming </body></item>
> =========================================
>
> With transform #2, we get 
> =========================================
> <?xml version="1.0" encoding="UTF-8"?>
>     
>          DOM 
>     
>      Learning Java Programming 
> =========================================
>
> So as you can see transform #2 is missing all the XML tags specified in
> the XSL file. It is important to note that when I run the above code
> without specifying XALAN, I get the correct output. I am assuming that
> Java is using an older version of Xalan which works correctly for
> getDocumentElement()
>
> If possible please explain why this is happening and if we can pass the
> getDocumentElement to the transform function.
>
> Thanks,
> Sushant.
>
>
>   

-- 
Nathan Nadeau
[email protected]
Software Development
Gleim Publications, Inc.
http://www.gleim.com