Subject: RE: [xsl] TransformerHandler Chaining with Java and Saxon From: "Scott Lynch" <slynch@xxxxxxxxxx> Date: Wed, 3 Jun 2009 09:57:19 -0400 |
Thanks, Michael. I'll try upgrading to see if things get better. cheers, Scott -----Original Message----- From: Michael Kay [mailto:mike@xxxxxxxxxxxx] Sent: Tuesday, June 02, 2009 7:14 PM To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx 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@xxxxxxxxxx] > Sent: 02 June 2009 23:50 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > 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)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] TransformerHandler Chaini, Michael Kay | Thread | RE: [xsl] TransformerHandler Chaini, Scott Lynch |
RE: [xsl] TransformerHandler Chaini, Michael Kay | Date | RE: [xsl] TransformerHandler Chaini, Scott Lynch |
Month |