[jdom-interest] java.lang.IllegalStateException

Robert Douglass r.douglass at onlinehome.de
Sun Oct 13 06:39:08 PDT 2002


Hello JDOM list,

I'm getting the following error

java.lang.IllegalStateException: Root element not set
	at org.jdom.Document.getContent(Document.java:332)
	at org.jdom.output.XMLOutputter.output(XMLOutputter.java:794)
	at org.jdom.output.XMLOutputter.output(XMLOutputter.java:585)
	at sbpgames.util.XmlUtil.applyXPath(XmlUtil.java:39)
	at sbpgames.util.XmlUtil.main(XmlUtil.java:128)

when I attempt to use XMLOutputter.output on a document that is a result of
an in memory Transformer transformation. The main method (at the bottom)
creates a Document and passes that, along with an XPath expression as a
String to applyXPath (first method in the class). applyXPath creates a xsl
document that matches / and selects the XPath expression fed to it.  This
stylesheet and the xml document are then fed to transform(JDOMSource in,
Source stylesheet, which returns a Document. If I change this line in the
transform method

	JDOMResult out = new JDOMResult();

to

	Result out = new StreamResult(System.out);

then I see that the transformation is working as expected. Therefore, I
suspect that I don't understand what happens to out in
transformer.transform(in, out);

I'm new to this technology, so I realize my error could be anywhere, and
that this is a long chunk of code. Therefore I am very grateful to anybody
who has the time to look at it.

-Robert Douglass



public class XmlUtil {
	private static XMLOutputter xmlOutputter = new XMLOutputter("  ", true);

	public static synchronized Document applyXPath(Document doc, String path) {
		Document result = null;
		try {
			JDOMSource xmlSource = new JDOMSource(doc);
			// returns a stylesheet that matches / and selects the path in "path"
			Document xsltSourceDoc = getStyleSheetWithTemplateElement(path);
			Source xsltSource = new JDOMSource(xsltSourceDoc);

			// output the two documents to System.out
			System.out.println("doc:");
			xmlOutputter.output(doc, System.out);
			System.out.println("xsltSourceDoc:");
			xmlOutputter.output(xsltSourceDoc, System.out);

			// transformation
			result = transform(xmlSource, xsltSource);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	public static synchronized Document transform(
		JDOMSource in,
		Source stylesheet)
		throws JDOMException {
		try {
			Transformer transformer =
				TransformerFactory.newInstance().newTransformer(stylesheet);
			JDOMResult out = new JDOMResult();
			transformer.transform(in, out);
			return out.getDocument();
		} catch (TransformerException e) {
			throw new JDOMException("XSLT Trandformation failed", e);
		}
	}

	public static synchronized Document getStyleSheetWithTemplateElement(String
path) {
		Document result = getEmptyXmlStyleSheet();
		Element templateElement =
			new Element("template", result.getRootElement().getNamespace());
		templateElement.setAttribute("match", "/");
		Element valueOfTemplate =
			new Element("value-of", result.getRootElement().getNamespace());
		valueOfTemplate.setAttribute("select", path);
		templateElement.addContent(valueOfTemplate);
		result.getRootElement().addContent(templateElement);
		return result;
	}

	public static synchronized Document getEmptyStyleSheet() {
		Element root =
			new Element(
				"stylesheet",
				"xsl",
				"http://www.w3.org/1999/XSL/Transform");
		root.setAttribute("version", "1.0");
		Document result = new Document(root);
		return result;
	}

	public static synchronized Document getEmptyXmlStyleSheet() {
		Document result = getEmptyStyleSheet();
		result = addOutputElement(result, "xml");
		return result;
	}

	private static synchronized Document addOutputElement(
		Document result,
		String method) {
		Element outputElement =
			new Element("output", result.getRootElement().getNamespace());
		outputElement.setAttribute("method", method);
		result.getRootElement().addContent(outputElement);
		return result;
	}

	public static void main(String[] args) {
		try {
			// create a simple XML document
			Element root = new Element("Dog");
			Element node = new Element("Name");
			node.setAttribute("Age", "7");
			node.setText("Fifi");
			root.addContent(node);
			Document doc = new Document(root);

			// goal is to get "7" from above
			Document pathApplied = applyXPath(doc, "/Dog/Name/@*");

/////////////////// error produced here //////////////////////
			xmlOutputter.output(pathApplied, System.out);
//////////////////////////////////////////////////////////////
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}




More information about the jdom-interest mailing list