xsl-list
[Top] [All Lists]

RE: Re: using SAX events in URIResolver (Xalan and Saxon)

2005-01-16 11:27:46
I'm very confused by what you're trying to do here.

You've got a transformation T, running in the form of a TransformerHandler,
that calls the document function to access a document D. You say "The
Transformer resolver sends the current TransformerHandler to a method that
uses it to send SAX events." So D is actually the output of T - or have I
misunderstood? This sounds to me as if you are trying to get the
transformation to read its own output. Surely it shouldn't be surprising if
this causes some kind of infinite loop?

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



-----Original Message-----
From: Robert Koberg [mailto:rob(_at_)koberg(_dot_)com] 
Sent: 16 January 2005 16:13
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Re: using SAX events in URIResolver (Xalan and Saxon)

Hi,

I have gotten a little further along, but still cannot make 
this work. I 
have tried this with 4 XSL processors: Saxon 6.5.3, Xalan (both 
interpretive and XSLTC - latest release) and Resin 2.1.14.

I am using two URIResolvers - one for the 
SAXTransformerFactory and then 
another one for the Transformer. This simply will not work with the 
compiling processors (XSLTC and Resin) because they ONLY allow you to 
set the URIResolver on the TransformerFactory and ignore the 
resolver on 
the Transformer. Just to be clear, the Templates (TransformerFactory) 
resolver only has to worry about resolving XSL files and the 
Transformer 
resolver only has to worry about resolving XML files they are 
authorized 
to use (or return a well-formed error to the transform if 
source/file is 
  not found or is not allowed). The Transformer resolver sends the 
current TransformerHandler to a method that uses it to send 
SAX events.

For Saxon and Xalan(interpretive), the error seems similar. Note: the 
transformation works when not using SAX events. Using SAX 
events, I seem 
to have created an endless loop. Saxon loops until I stop the app.
Xalan stops after the first iteration with the error:

(Location of error unknown)Can not load requested doc: Variable 
focus_dc_identifier is directly or indirectly
referencing itself!
Warning: popContextNodeList when stack is empty!

Here is the variable definition:

<xsl:variable
   name="focus_metadata_path"
   select="concat('metadata/', $lsb_focus_localName, '/', 
$user.focus.idref, '.xml')"/>

<xsl:variable name="lsb_focus_metadata" 
select="document($focus_metadata_path)/*"/>

<xsl:variable name="focus_dc_identifier">
   <xsl:variable name="dcElem" 
select="$lsb_focus_metadata/s:dc/dc:identifier"/>
   <xsl:choose>
     <xsl:when test="not($dcElem)">
       <xsl:text>http://</xsl:text>
       <xsl:value-of select="$project.domain"/>
       <xsl:apply-templates select="$lsb_focus_nodeset" 
mode="getNamePath"/>
     </xsl:when>
     <xsl:otherwise>
       <xsl:value-of select="normalize-space($dcElem)"/>
     </xsl:otherwise>
   </xsl:choose>
</xsl:variable>


and it is only referenced here (in this scenario):

<meta content="{$focus_dc_identifier}" name="DC.identifier"/>


The java code looks like:

//uses a cached Templates object to create the TransformerHandler.
// the Templates object uses its own URIResolver to resolve 
xsl:imports
TransformerHandler transformerHandler = project.getTransformerHandler(
       lsb, xslFile, refreshXslCache);

ServletOutputStream out = response.getOutputStream();

try {
// tried two ways to set the Result

   //SerializerFactory serializerFactory = 
SerializerFactory.getSerializerFactory("xml");
   //Serializer serializer = serializerFactory.makeSerializer(new 
OutputFormat());
   //serializer.setOutputByteStream(out);

   Result result = new SAXResult(transformerHandler);
   //Result result = new SAXResult(serializer.asContentHandler());

   transformerHandler.setResult(result);

   Transformer transformer = transformerHandler.getTransformer();

// a different URIResolver for XML requested by the document function
// it passes the current TransformerHandler to be used to 
output SAX events
   transformer.setURIResolver(user.getTransformerUriResolver(
               transformerHandler, lsb, project));

   Properties params = getParamProperties(project, user, request,
           focusElem);

   Enumeration e = params.propertyNames();

   while (e.hasMoreElements()) {
       String name = (String) e.nextElement();
       transformer.setParameter(name, params.getProperty(name));
   }

// treeMgr.getSource() is a org.dom4j.io.DocumentSource
// which extends SAXSource. It is basically a configuration tree
// that tells the transformation which files to gather with the
// document function.
   transformer.transform(treeMgr.getSource(), result);

   ....




Xalan's stacktrace is:

javax.xml.transform.TransformerException: 
java.lang.ArrayIndexOutOfBoundsException:
-2
      at 
org.apache.xalan.transformer.TransformerImpl.transformNode(Tra
nsformerImpl.java:1339)
      at 
org.apache.xalan.transformer.TransformerImpl.transform(Transfo
rmerImpl.java:673)
      at 
org.apache.xalan.transformer.TransformerImpl.transform(Transfo
rmerImpl.java:1192)
      at 
org.apache.xalan.transformer.TransformerImpl.transform(Transfo
rmerImpl.java:1170)
      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:534)
Caused by: java.lang.ArrayIndexOutOfBoundsException: -2
      at org.apache.xpath.VariableStack.unlink(VariableStack.java:212)
      at 
org.apache.xalan.transformer.TransformerImpl.applyTemplateToNo
de(TransformerImpl.java:2215)
      at 
org.apache.xalan.transformer.TransformerImpl.transformNode(Tra
nsformerImpl.java:1276)
      ... 18 more
---------
java.lang.ArrayIndexOutOfBoundsException: -2
      at org.apache.xpath.VariableStack.unlink(VariableStack.java:212)
      at 
org.apache.xalan.transformer.TransformerImpl.applyTemplateToNo
de(TransformerImpl.java:2215)
      at 
org.apache.xalan.transformer.TransformerImpl.transformNode(Tra
nsformerImpl.java:1276)
      at 
org.apache.xalan.transformer.TransformerImpl.transform(Transfo
rmerImpl.java:673)
      at 
org.apache.xalan.transformer.TransformerImpl.transform(Transfo
rmerImpl.java:1192)
      at 
org.apache.xalan.transformer.TransformerImpl.transform(Transfo
rmerImpl.java:1170)
      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:534)

--~------------------------------------------------------------------
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>
--~--