You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xalan.apache.org by Sushant Sinha <su...@gmail.com> on 2010/10/15 16:00:49 UTC

xalan transform not working when passed the getDocumentElement()

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.



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

Posted by Nathan Nadeau <nd...@gleim.com>.
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
ndn@gleim.com
Software Development
Gleim Publications, Inc.
http://www.gleim.com