RE: [xsl] using SAX events in URIResolver

Subject: RE: [xsl] using SAX events in URIResolver
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sat, 15 Jan 2005 17:07:46 -0000
> It is very expensive to convert a file to a 
> byte array 
> and it still has to be parsed every time, so I am trying to provide 
> cached SAX events. Is it possible? 

Saxon 6.5.3 in fact maintains a result tree fragment in the form of a list
of SAX events. See the source code of com.icl.saxon.expr.FragmentValue. In
the end, however, I discovered that the TinyTree is a more efficient
representation of a document (especially, of course, as 2.0 allows full
XPath access into the document). You would be better off building the tree
and caching it in that form, especially as it involves writing less code.

A minor point: if you're transforming the same document multiple times, it's
best not to use xsl:strip-space in the stylesheet.

> 
> The events are stored correctly and when the parse of the XMLFilter 
> occurs the events are output correctly (I believe). The parse calls a 
> method (sendEvents) that iterates over the list of SAX events. See my 
> trace of what is going on below the exception. I get the following 
> exception when running the code:
> 
> 
> java.lang.NullPointerException

This sort of question really belongs on the saxon-help list, not here. The
relevant line of GeneralOutputter reads:

throw new IllegalArgumentException("Unknown type of Result: " +
result.getClass());

so the NullPointerException occurs during an unsuccessful attempt to report
a fatal error, which looks to me simply like a failure to call setResult()
on the TransformerHandler.

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


> 
> 	at 
> com.icl.saxon.output.GeneralOutputter.makeEmitter(GeneralOutpu
> tter.java:272)
> 
> 	at 
> com.icl.saxon.output.GeneralOutputter.setOutputDestination(Gen
> eralOutputter.java:66)
> 
> 	at 
> com.icl.saxon.Controller.changeOutputDestination(Controller.java:405)
> 
> 	at 
> com.icl.saxon.Controller.transformDocument(Controller.java:1076)
> 
> 	at 
> com.icl.saxon.TransformerHandlerImpl.endDocument(TransformerHa
> ndlerImpl.java:101)
> 
> 	at 
> com.livestoryboard.SaxEventsCacheEntry.sendEvents(Unknown Source)
> 
> 	at com.livestoryboard.SaxEventsCacheEntry.parse(Unknown Source)
> 
> 	at com.icl.saxon.om.Builder.build(Builder.java:265)
> 
> 	at com.icl.saxon.functions.Document.makeDoc(Document.java:228)
> 
> 	at 
> com.icl.saxon.functions.Document.getDocuments(Document.java:134)
> 
> 	at com.icl.saxon.functions.Document.evaluate(Document.java:70)
> 
> 	at com.icl.saxon.functions.Document.reduce(Document.java:299)
> 
> 	at 
> com.icl.saxon.expr.PathExpression.reduce(PathExpression.java:160)
> 
> 	at 
> com.icl.saxon.expr.NodeSetExpression.evaluate(NodeSetExpressio
> n.java:39)
> 
> 	at 
> com.icl.saxon.style.XSLGeneralVariable.getSelectValue(XSLGener
> alVariable.java:251)
> 
> 	at com.icl.saxon.style.XSLVariable.process(XSLVariable.java:89)
> 
> 	at 
> com.icl.saxon.style.XSLStyleSheet.process(XSLStyleSheet.java:626)
> 
> 	at 
> com.icl.saxon.Controller.transformDocument(Controller.java:1082)
> 
> 	at com.icl.saxon.Controller.transform(Controller.java:953)
> 
> 	at com.livestoryboard.actions.Preview.service(Unknown Source)
> 
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:103)
> 
> 	at 
> com.caucho.server.http.FilterChainServlet.doFilter(FilterChain
> Servlet.java:96)
> 
> 	at 
> com.livestoryboard.actions.EntryFilter.doFilter(Unknown Source)
> 
> 	at 
> com.caucho.server.http.FilterChainFilter.doFilter(FilterChainF
> ilter.java:88)
> 
> 	at 
> com.livestoryboard.actions.PermissionsFilter.doFilter(Unknown Source)
> 
> 	at 
> com.caucho.server.http.FilterChainFilter.doFilter(FilterChainF
> ilter.java:88)
> 
> 	at 
> com.livestoryboard.actions.CheckUserFilter.doFilter(Unknown Source)
> 
> 	at 
> com.caucho.server.http.FilterChainFilter.doFilter(FilterChainF
> ilter.java:88)
> 
> 	at 
> com.caucho.server.http.Invocation.service(Invocation.java:315)
> 
> 	at 
> com.caucho.server.http.CacheInvocation.service(CacheInvocation
> .java:135)
> 
> 	at 
> com.caucho.server.http.RunnerRequest.handleRequest(RunnerReque
> st.java:346)
> 
> 	at 
> com.caucho.server.http.RunnerRequest.handleConnection(RunnerRe
> quest.java:274)
> 
> 	at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
> 
> 	at java.lang.Thread.run(Thread.java:595)
> 
> 
> 
> 
> 
> 
> 
> [Trace]
> 
> SaxEventsCache.getSaxSource file: 
> projects\rob-test\lsb\metadata\site\site_root.xml
> 
> SaxEventsCache.getSaxSource entry: null
> 
> SaxEventsCacheEntry.parse source: org.xml.sax.InputSource@33b121
> 
> SaxEventsCacheEntry.startElement namespaceURI: 
> http://livestoryboard.com/schemas/lsb
> 
> SaxEventsCacheEntry.startElement localName: md-folder
> 
> SaxEventsCacheEntry.startElement qualifiedName: md-folder
> 
> SaxEventsCache.getSaxSource entry NEW: 
> com.livestoryboard.SaxEventsCacheEntry@1aa2c23
> 
> SaxEventsCacheEntry.parse source (instanceof SaxEventsInputSource): 
> com.livestoryboard.SaxEventsInputSource@7d4a4
> 
> SaxEventsCacheEntry.sendEvents saxEvent: START_DOCUMENT
> 
> SaxEventsCacheEntry.sendEvents saxEvent: START_PREFIX_MAPPING
> 
> SaxEventsCacheEntry.sendEvents saxEvent: START_ELEMENT
> 
> SaxEventsCacheEntry.sendEvents saxEvent.getParm(0): 
> http://livestoryboard.com/schemas/lsb
> 
> SaxEventsCacheEntry.sendEvents saxEvent.getParm(1): md-folder
> 
> SaxEventsCacheEntry.sendEvents saxEvent.getParm(2): md-folder
> 
> SaxEventsCacheEntry.sendEvents attParms[0]:
> 
> SaxEventsCacheEntry.sendEvents attParms[1]:
> 
> SaxEventsCacheEntry.sendEvents attParms[2]: xmlns
> 
> SaxEventsCacheEntry.sendEvents attParms[3]: CDATA
> 
> SaxEventsCacheEntry.sendEvents attParms[4]: 
> http://livestoryboard.com/schemas/lsb
> 
> SaxEventsCacheEntry.sendEvents attParms[0]:
> 
> SaxEventsCacheEntry.sendEvents attParms[1]: created
> 
> SaxEventsCacheEntry.sendEvents attParms[2]: created
> 
> SaxEventsCacheEntry.sendEvents attParms[3]: CDATA
> 
> SaxEventsCacheEntry.sendEvents attParms[4]: 2004-03-08T11:25:05
> 
> SaxEventsCacheEntry.sendEvents attParms[0]:
> 
> SaxEventsCacheEntry.sendEvents attParms[1]: creator
> 
> SaxEventsCacheEntry.sendEvents attParms[2]: creator
> 
> SaxEventsCacheEntry.sendEvents attParms[3]: CDATA
> 
> SaxEventsCacheEntry.sendEvents attParms[4]: Robert Koberg
> 
> SaxEventsCacheEntry.sendEvents attParms[0]:
> 
> SaxEventsCacheEntry.sendEvents attParms[1]: last_mod_by
> 
> SaxEventsCacheEntry.sendEvents attParms[2]: last_mod_by
> 
> SaxEventsCacheEntry.sendEvents attParms[3]: CDATA
> 
> SaxEventsCacheEntry.sendEvents attParms[4]: Robert Koberg
> 
> SaxEventsCacheEntry.sendEvents attParms[0]:
> 
> SaxEventsCacheEntry.sendEvents attParms[1]: modified
> 
> SaxEventsCacheEntry.sendEvents attParms[2]: modified
> 
> SaxEventsCacheEntry.sendEvents attParms[3]: CDATA
> 
> SaxEventsCacheEntry.sendEvents attParms[4]: 2004-08-02T17:00:02
> 
> SaxEventsCacheEntry.sendEvents saxEvent: END_ELEMENT
> 
> SaxEventsCacheEntry.sendEvents saxEvent: END_PREFIX_MAPPING
> 
> SaxEventsCacheEntry.sendEvents saxEvent: END_DOCUMENT

Current Thread