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