xsl-list
[Top] [All Lists]

RE: [xsl] TransformerHandler Chaining with Java and Saxon

2009-06-03 09:58:18
Thanks, Michael. I'll try upgrading to see if things get better.

cheers,
Scott 

-----Original Message-----
From: Michael Kay [mailto:mike(_at_)saxonica(_dot_)com] 
Sent: Tuesday, June 02, 2009 7:14 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] TransformerHandler Chaining with Java and Saxon

Could be this bug

https://sourceforge.net/tracker/index.php?func=detail&aid=1558231&group_
id=2
9872&atid=397617

though that's documented as applying to 8.8 rather than 8.9.

Another candidate is this one, in 9.0

https://sourceforge.net/tracker/?func=detail&aid=1986836&group_id=29872&;
atid
=397617

I suggest you try it on a more recent release. The current release is
9.1.0.6.

Also, I suggest you raise Saxon-specific problems on the saxon-help list
at SourceForge.

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay  

-----Original Message-----
From: Scott Lynch [mailto:slynch(_at_)nortel(_dot_)com]
Sent: 02 June 2009 23:50
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] TransformerHandler Chaining with Java and Saxon

All,

This is not quite an xsl question, but hopefully someone here has seen

this before and can help me, because I've been banging my head on my 
keyboard for hours now. I'm trying to chain together several 
transforms using the TransformerHandler chaining design pattern in 
Java with the Saxon (8.9) engine. The code below invariable throws an 
exception complaining about "The TransformerHandler is not serially 
reusable. The
startDocument() method must be called once only." when the
reader.parse(source) method is invoked. 

Does anyone know why this would be happening and how to prevent it? I 
am able to individually transform my file with the transforms by using

a set of rotating temporary files, but I would like to increase the 
speed of the transformation (I'm transforming about 17 files 
comprising 50meg of data through about 10 transforms and this is 
taking several
minutes) using chaining if possible.

thanks,
Scott


    private String multiTransform(String sourceFileName, List<String> 
transformFiles, String startKey)
    {
        String outFileName = "transformOutput.xml";
        try
        {
            TransformerFactory factory = 
TransformerFactory.newInstance();
            SAXTransformerFactory saxTFactory =
((SAXTransformerFactory) factory);
            List<TransformerHandler> handlers = new 
ArrayList<TransformerHandler>();
            TransformerHandler previousHandler = null;
            for (String transformFile : transformFiles)
            {
                StreamSource source = new 
StreamSource(Resources.getResource(transformFile).openStream());
                TransformerHandler handler = 
saxTFactory.newTransformerHandler(source);
                handlers.add(handler);
                if (previousHandler != null)
                {
                    previousHandler.setResult(new SAXResult(handler));
                    break;
                }
                previousHandler = handler;
            }

            XMLReader reader = XMLReaderFactory.createXMLReader();
            reader.setContentHandler(handlers.get(0));

            TransformerHandler lastHandler =
handlers.get(handlers.size() - 1);
            OutputStream resultOutStream = new 
FileOutputStream(outFileName);
            StreamResult xformOutResult = new 
StreamResult(resultOutStream);
            lastHandler.setResult(xformOutResult);
            FileInputStream fileInStrm = new 
FileInputStream(sourceFileName);
            InputSource source = new InputSource(fileInStrm);
            reader.parse(source);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return outFileName;
    }



The exception...

java.lang.UnsupportedOperationException: The TransformerHandler is not

serially reusable. The
startDocument() method must be called once only.
      at
net.sf.saxon.TransformerHandlerImpl.startDocument(TransformerH
andlerImpl
.java:69)
      at
net.sf.saxon.event.ContentHandlerProxy.open(ContentHandlerProx
y.java:242
)
      at net.sf.saxon.event.ProxyReceiver.open(ProxyReceiver.java:76)
      at
net.sf.saxon.event.ImplicitResultChecker.open(ImplicitResultCh
ecker.java
:24)
      at
net.sf.saxon.event.ImplicitResultChecker.firstContent(Implicit
ResultChec
ker.java:59)
      at
net.sf.saxon.event.ImplicitResultChecker.startElement(Implicit
ResultChec
ker.java:30)
      at
net.sf.saxon.event.NamespaceReducer.startElement(NamespaceRedu
cer.java:5
4)
      at
net.sf.saxon.event.ComplexContentOutputter.startContent(Comple
xContentOu
tputter.java:481)
      at
net.sf.saxon.event.ComplexContentOutputter.characters(ComplexC
ontentOutp
utter.java:136)
      at net.sf.saxon.instruct.Copy.processLeavingTail(Copy.java:164)
      at
net.sf.saxon.instruct.Choose.processLeavingTail(Choose.java:338)
      at
net.sf.saxon.instruct.Template.applyLeavingTail(Template.java:99)
      at
net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTempl
ates.java:
319)
      at
net.sf.saxon.instruct.ApplyTemplates.apply(ApplyTemplates.java:189)
      at
net.sf.saxon.instruct.ApplyTemplates.process(ApplyTemplates.java:149)
      at
net.sf.saxon.instruct.ElementCreator.processLeavingTail(Elemen
tCreator.j
ava:250)
      at net.sf.saxon.instruct.Copy.processLeavingTail(Copy.java:152)
      at
net.sf.saxon.instruct.Choose.processLeavingTail(Choose.java:338)
      at
net.sf.saxon.instruct.Template.applyLeavingTail(Template.java:99)
      at
net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTempl
ates.java:
319)
      at
net.sf.saxon.instruct.ApplyTemplates.defaultAction(ApplyTempla
tes.java:3
51)
      at
net.sf.saxon.instruct.ApplyTemplates.applyTemplates(ApplyTempl
ates.java:
312)
      at
net.sf.saxon.Controller.transformDocument(Controller.java:1602)
      at
net.sf.saxon.TransformerHandlerImpl.endDocument(TransformerHan
dlerImpl.j
ava:133)
      at
com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.e
ndDocument
(AbstractSAXParser.java:737)
      at
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentSca
nnerImpl.s
canDocument(XMLDocumentFragmentScannerImpl.java:515)
      at
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.
parse(XML1
1Configuration.java:807)
      at
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.
parse(XML1
1Configuration.java:737)
      at
com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XML
Parser.jav
a:107)
      at
com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.p
arse(Abstr
actSAXParser.java:1205)

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>