Re: Query regarding XSLT "Root element not set"
Amit Jain wrote:
I am getting below exception will running program:
************* exception start **********
false
Exception in thread "main" java.lang.IllegalStateException: Root
element not set
at org.jdom.Document.getContent(Document.java:408)
at SimpleXalan1.main(SimpleXalan1.java:70)
************* exception ends **********
**************** Java Program Start *************
public class SimpleXalan1{
public static void main(String[] args)
throws MalformedURLException, SAXException, Exception{
SAXBuilder builder = new SAXBuilder();
Document xsltdoc = builder.build("C://Workspace//xsltdemo//
classes//message.xsl");
Document inputDoc = builder.build("C://Workspace//xsltdemo//
classes//message.xml");
JDOMResult jdomResult = new JDOMResult();
Transformer obj = TransformerFactory.newInstance().newTransformer
(new JDOMSource(xsltdoc));
obj.transform(new JDOMSource(inputDoc), jdomResult);
Document resultDoc = jdomResult.getDocument();
System.out.println(resultDoc.hasRootElement());
System.out.println(resultDoc.getContent());
}
}
*************** Java Program Ends *************
Modified version:
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import org.jdom.Document;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jdom.transform.JDOMResult;
import org.jdom.transform.JDOMSource;
public class SimpleXalan {
public static void main(String[] args) throws Exception {
SAXBuilder builder = new SAXBuilder();
Document xsltdoc = builder.build("C:/message.xsl");
Document inputDoc = builder.build("C:/message.xml");
JDOMResult jdomResult = new JDOMResult();
Transformer obj =
TransformerFactory.newInstance().newTransformer(new JDOMSource(xsltdoc));
obj.transform(new JDOMSource(inputDoc), jdomResult);
Document resultDoc = jdomResult.getDocument();
XMLOutputter fmt = new XMLOutputter(Format.getPrettyFormat());
System.out.println(fmt.outputString(resultDoc));
}
}
I changed the // in filenames to / and used some nicer
output.
*************** message.xml Start *************
<?xml version="1.0" encoding="UTF-8"?>
<message>Yep, it worked!</message>
*************** message.xml Ends *************
*************** message.xsl Start *************
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<!-- simply copy the message to the result tree -->
<xsl:template match="/">
<xsl:value-of select="message"/>
</xsl:template>
</xsl:stylesheet>
*************** message.xsl Ends *************
As the error message suggests you are missing the root element, so
I added one with the traditional name of foobar:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:template match="/">
<foobar>
<xsl:value-of select="message"/>
</foobar>
</xsl:template>
</xsl:stylesheet>
Arne