RE: [xsl] XTDE1490 and using the Saxon transformer multiple times

Subject: RE: [xsl] XTDE1490 and using the Saxon transformer multiple times
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 26 Jun 2007 22:48:10 +0100
I've logged a bug entry for this and there's a patch in the Subversion
repository.

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

> -----Original Message-----
> From: Norman Gray [mailto:norman@xxxxxxxxxxxxxxx] 
> Sent: 26 June 2007 12:57
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] XTDE1490 and using the Saxon transformer multiple times
> 
> 
> Greetings.
> 
> I'm getting an error (XTDE1490) when I use the Saxon 8.9 
> Transformer multiple times.
> 
> It's not obvious to me what I'm doing wrong, the explanation 
> of XTDE1490 at [1] doesn't apply, and there's no obvious 
> insight in the list archive for the various searches I've tried.
> 
> 
> My (complete) test program is
> 
> import javax.xml.transform.*;
> import javax.xml.transform.stream.StreamSource;
> import javax.xml.transform.stream.StreamResult;
> public class SaxonTry {
>      public static void main(String[] args) {
>          String xsltFile = "identity.xslt";
>          Source[] sources = new Source[args.length];
>          Result[] results = new Result[args.length];
>          for (int i=0; i<args.length; i++) {
>              sources[i] = new StreamSource(args[i]);
>              results[i] = new StreamResult(args[i]+"-res");
>          }
>          try {
>              Transformer trans = TransformerFactory.newInstance()
>                      .newTransformer(new StreamSource(xsltFile));
>              for (int i=0; i<args.length; i++) {
>                  System.err.println("Transforming: " + sources
> [i].getSystemId()
>                                     + " -> " + 
> results[i].getSystemId ());
>                  trans.transform(sources[i], results[i]);
>              }
>          } catch (Exception e) {
>              System.err.println("Exception: " + e);
>          }
>      }
> }
> 
> The identity.xslt is the usual XSLT identity transform.
> 
> Running this with the default transformer works fine:
> 
> % CLASSPATH=. java SaxonTry test-in{1,2}.xml
> Transforming: test-in1.xml -> test-in1.xml-res
> Transforming: test-in2.xml -> test-in2.xml-res %
> 
> and produces two output files as expected.  Using the Saxon 
> 8.9 transformer, however, produces errors:
> 
> % CLASSPATH=$T/saxon-8.9/saxon8.jar:. java \
>    -
> Djavax.xml.transform.TransformerFactory=net.sf.saxon.Transform
> erFactoryI
> mpl \
>    SaxonTry test-in1.xml test-in2.xml
> Warning: at xsl:transform on line 3 of file:///Volumes/Lagrange/
> checkouts/me/code/misc/identity.xslt:
>    Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
> Transforming: test-in1.xml -> test-in1.xml-res
> Transforming: test-in2.xml -> test-in2.xml-res Error at 
> xsl:copy on line 6 of file:///Volumes/Lagrange/checkouts/me/
> code/misc/identity.xslt:
>    XTDE1490: Cannot write an implicit result document if an 
> explicit result document has been
>    written to the same URI: test-in1.xml-res
> Exception: net.sf.saxon.trans.DynamicError: Cannot write an 
> implicit result document if an explicit result document has 
> been written to the same URI: test-in1.xml-res %
> 
> There's no result-document element in the identity 
> transformation, but there's no need for once, since the
> javax.xml.transform.Transformer.transform() method is being 
> given explicit Source and Result arguments.
> 
> The javax.xml.transform.Transformer documentation[2] 
> indicates that the Transformer `may be used multiple times', 
> and that it `may then be used to process XML from a variety 
> of sources and write the transformation output to a variety 
> of sinks.'  That certainly suggests that I _ought_ to be able 
> to do what I'm doing by reusing the Transformer with multiple 
> Sources and Results.  What appears to be happening, however, 
> is that the Saxon Transformer is attempting to use the first 
> Result for both transformations (or something like that).
> 
> I've looked at Templates, but as far as I can tell from the 
> javadocs, the only issue there is that a Template is 
> thread-safe, and so can produce multiple (unsafe) 
> Transformers implementing a single  
> transformation, which can themselves be used in separate threads.   
> But that's not my situation here.
> 
> Am I doing something dim?
> 
> Thanks for any pointers.  Best wishes,
> 
> Norman
> 
> 
> 
> [1] http://www.w3.org/TR/xslt20/#err-XTDE1490
> [2] http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/transform/
> Transformer.html
> 
> --
> ------------------------------------------------------------------
> Norman Gray  :  http://nxg.me.uk
> eurovotech.org  :  University of Leicester, UK

Current Thread