Something Odd in JDomResult (StreamResult works fine) (?) was R: [jdom-interest] XML and XSL, fine using xt command line parser, but java.util.EmptyStackException in JDom
daniele rizzi
daniele.rizzi at ls.largesys.it
Fri Jul 20 02:44:51 PDT 2001
Dear all,
if you mind running the following code, you'll be amazed discovering
that a Transform into StreamResult works fine but the very same Transform
into a JDomResult falls into a java.util.EmptyStackException
any hint ?
daniele.rizzi at largesys.it (ps. SAXResult works!, but it's not so useful)
---- begin of code ----
package dany;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import org.jdom.transform.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.xml.transform.*;
import javax.xml.transform.sax.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import oracle.xml.parser.v2.* ;
public class ErrorXsl {
public String xmlData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> " +
"<TemplateBody><Free_Form_Text>Ref#: </Free_Form_Text>" +
"end of template</TemplateBody>";
public String xslData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> " +
"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" " +
" version=\"1.0\"> " +
"<xsl:template match=\"TemplateBody\"> "+
" Dear , <xsl:apply-templates/> Thank you for your
business.</xsl:template> "+
" </xsl:stylesheet>";
/**
* Constructor
*/
public ErrorXsl() {
try {
//1_ open xml
StringReader sr = new StringReader(xmlData);
SAXBuilder saxbuilder = new SAXBuilder(
"oracle.xml.parser.v2.SAXParser", false);
Document docXml = saxbuilder.build(sr);
sr.close();
System.out.println(printDocument(docXml));
//2_ open xsl
sr = new StringReader(xslData);
SAXSource ss = new SAXSource( new InputSource(sr));
Transformer transformer =
TransformerFactory.newInstance().newTransformer(ss);
// this works
//StreamResult outDoc = new StreamResult(new File("c:\\pippo.txt"));
// this works too!
//SAXResult outDoc = new SAXResult(new DefaultHandler());
// this not!
JDOMResult outDoc = new JDOMResult();
transformer.transform(new JDOMSource(docXml), outDoc);
}
catch(Exception ex) {
System.out.println("EX:"+ex.getMessage());
ex.printStackTrace();
}
}
}
/**
* main
*/
public static void main(String[] args) {
ErrorXsl errorXsl = new ErrorXsl();
}
}
---- end of code ----
-----Messaggio originale-----
Da: jdom-interest-admin at jdom.org
[mailto:jdom-interest-admin at jdom.org]Per conto di Kevin Williams
Inviato: venerdì 20 luglio 2001 0.42
A: jdom-interest at jdom.org
Oggetto: [jdom-interest] XML and XSL, fine using xt command line parser,
but java.util.EmptyStackException in JDom
Sorry for the length, but I wanted to make sure there was enough information
to determine what the error is. When I transform the xml with the xsl from
the command line, it works fine. When using JDom (code snippet at bottom) I
get an exception. I'm new to XSL (started yesterday :) ) so it may be a
simple error. Thanks for your help.
Here is the error I get when attempting to transform an xml string using a
simple stylesheet:
javax.xml.transform.TransformerException: java.util.EmptyStackException
at
org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.j
ava:1212)
at
org.apache.xalan.transformer.TransformerImpl.run(TransformerImpl.java:2894)
at java.lang.Thread.run(Thread.java:484)
---------
java.util.EmptyStackException
at java.util.Stack.peek(Stack.java:82)
at org.jdom.input.SAXHandler.characters(SAXHandler.java:483)
at
org.xml.sax.helpers.XMLFilterImpl.characters(XMLFilterImpl.java:614)
at
org.apache.xalan.transformer.ResultTreeHandler.characters(ResultTreeHandler.
java:446)
at
org.apache.xalan.templates.ElemTextLiteral.execute(ElemTextLiteral.java:233)
at
org.apache.xalan.templates.ElemForEach.transformSelectedNodes(ElemForEach.ja
va:495)
at
org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.jav
a:193)
at
org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(Transform
erImpl.java:2154)
at
org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(Transform
erImpl.java:2097)
at
org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(Transformer
Impl.java:2029)
at
org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.j
ava:1189)
at
org.apache.xalan.transformer.TransformerImpl.run(TransformerImpl.java:2894)
at java.lang.Thread.run(Thread.java:484)
+++++++++++++++++++++++++++++++++++++++
the XML source:
<?xml version="1.0" encoding="UTF-8"?>
<TemplateBody><Free_Form_Text>Ref#: </Free_Form_Text><ref_number>
#[ref_number]
<!-- This displays the reference number. -->
</ref_number><Free_Form_Text>
</Free_Form_Text><Free_Form_Text>PositionType:
</Free_Form_Text><position_type>
#[position_type]
<!-- This displays the current position type. -->
</position_type><Free_Form_Text>
</Free_Form_Text><Free_Form_Text>Product ID: </Free_Form_Text><product_id>
#[product_id]
<!-- This displays the current product ID. -->
</product_id><Free_Form_Text>
</Free_Form_Text><Free_Form_Text>Product Type:
</Free_Form_Text><product_type>
#[product_type]
<!-- This displaysthe current product type. -->
</product_type><Free_Form_Text>
</Free_Form_Text><Free_Form_Text>Ref# (again): </Free_Form_Text><ref_number>
#[ref_number]
<!-- This displays the reference number. -->
</ref_number><Free_Form_Text>
</Free_Form_Text><Free_Form_Text>Product ID (again):
</Free_Form_Text><product_id>
#[product_id]
<!-- This displays the current product ID. -->
</product_id><Free_Form_Text>
</Free_Form_Text><Free_Form_Text>Ref# (yet again):
</Free_Form_Text><ref_number>
#[ref_number]
<!-- This displays the reference number. -->
</ref_number><Free_Form_Text>
</Free_Form_Text><Free_Form_Text>
</Free_Form_Text></TemplateBody>
++++++++++++++++++++++++++++++++++++++++++++++++++++
XSL template:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="TemplateBody">
Dear #[customer],
<xsl:apply-templates/>
Thank you for your business.
Sincerely,
#[Preparer]
</xsl:template>
++++++++++++++++++++++++++++++++++++++++++++++++++++
and the code that runs it:
org.jdom.Document jdom =
((JDomStyledDocument)bodyTextArea.getDocument()).generateJDom();
StringReader stylesheet = new StringReader(letterLayout);
try {
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new StreamSource(stylesheet));
JDOMResult out = new JDOMResult();
transformer.transform(new JDOMSource(jdom), out);
org.jdom.Document outdoc = out.getDocument();
ESIJDomTreeModel tempModel = new ESIJDomTreeModel(outdoc);
try {
String xmlStr = tempModel.generateXMLString();
letterTextPane.setText(xmlStr);
} catch (ESIException ex) {
new ESIExceptionDialog(null, ex);
}
} catch (TransformerException e) {
//throw new JDOMException("XSLT Trandformation failed", e);
ESILog.getLog().trace("XXXXXXXXXXXXX transform failed", e);
}
_______________________________________________
To control your jdom-interest membership:
http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhos
t.com
More information about the jdom-interest
mailing list