Antony Grinyer wrote:
Thanks to everyone's help I believe I'm getting closer to getting this
working...darn...I didn't realize transforming XML in Cocoon could cause
such a problem!

Presumably that is working with XML in Java can cause such a problem. As soon as you break out of Cocoon into Java, you're much more on your own.

> I've now changed my code to:

 private void generateDocumentToSAX(String queryResults)
  {
    try
    {
      XMLReader parser = XMLReaderFactory.createXMLReader();
      parser.setContentHandler(this);
      InputSource inputSource = new InputSource(new
StringReader(queryResults));
      parser.parse(inputSource);
    }
    catch(Exception e)
    {
      m_resultMessage = "Unable to get parser: " + e.toString();
      this.getLogger().error(m_resultMessage);
    }
  }

And I get this error in the sitemap.log:

----
Unable to get parser: java.lang.UnsupportedOperationException: The
TransformerHandler is not serially reusable. The startDocument() method
must be called once only.
-----

I think this might be happening because I pass in XML to the java class
transformer (containing the above method) which finds/creates the
startDocument element in the startElement method, and then the parser in
the method above creates another startDocument element, which is
confusing the saxon xslt transformer? I'm confused here now - if the
purpose of a Cocoon transformer is to take in some XML, change it, then
spit out the changed XML, why are the xlst (saxon, xalan) transformers
complaining about duplicated startDocument elements? Sure you can use a
parser to create Sax events within a transformer java class which
extends the AbstractSAXTransformer class?

I know I suggested using XMLReader, but given Conal's comment, why not just try SAXParser with Conal's fix? Basically, parsing a document you start with emitting a startDocument event. However, the startDocument event must already have been called - you've already emitted startElement events.

If you still need to get rid of startDocument/endDocument events, you need to create a NullDocEventPipe, which consumes them but does not emit them. You give that to your parser as the content handler, and give the content handler Cocoon gave you to your NullDocEventPipe. Make sense? This is pretty easy to do, I might even have one I can let you have.

Regards, Upayavira




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to