Hello,
I'd like to run a transform on multiple documents using a cached transformer, accumulating any errors that occur.
This minimal example -
for $doc in (<a/>,<b/>, <c/>) return try{ xslt:transform( $doc, <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='2.0'> <xsl:template match='/'><xsl:sequence select='error()'/></xsl:template> </xsl:transform>, map{}, map{'cache':'true'} ) } catch * {$err:description}
- results in:
Error in xsl:sequence/@select on line 1 column 135 of [...]: FOER0000: Error signalled by application call on error()Improper use? Potentia l bug? Your feedback is welcome: Contact: basex-talk@mailman.uni-konstanz.de Version: BaseX 9.3.2 Java: Oracle Corporation, 1.8.0_241 OS: Windows 7, amd64 Stack Trace: java.lang.NullPointerException at org.basex.io.out.ArrayOutput.write(ArrayOutput.java:32) at java.io.OutputStream.write(Unknown Source) at java.io.PrintStream.write(Unknown Source) at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source) at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source) at sun.nio.cs.StreamEncoder.flushBuffer(Unknown Source) at java.io.OutputStreamWriter.flushBuffer(Unknown Source) at java.io.PrintStream.write(Unknown Source) at java.io.PrintStream.print(Unknown Source) at java.io.PrintStream.println(Unknown Source) at net.sf.saxon.lib.StandardLogger.println(StandardLogger.java:121) at net.sf.saxon.lib.Logger.error(Logger.java:45) at net.sf.saxon.lib.StandardErrorListener.fatalError(StandardErrorListen er.java:305) at net.sf.saxon.Controller.reportFatalError(Controller.java:958) at net.sf.saxon.Controller.transform(Controller.java:1914) at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:579 ) at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:185)
at org.basex.query.func.xslt.XsltTransform.transform(XsltTransform.java: 135) at org.basex.query.func.xslt.XsltTransform.transform(XsltTransform.java: 62) at org.basex.query.func.xslt.XsltTransform.item(XsltTransform.java:40) at org.basex.query.expr.ParseExpr.value(ParseExpr.java:51) at org.basex.query.expr.Try.value(Try.java:94) at org.basex.query.expr.ParseExpr.iter(ParseExpr.java:46) at org.basex.query.expr.gflwor.GFLWOR$1.next(GFLWOR.java:72) at org.basex.query.QueryContext.next(QueryContext.java:353) at org.basex.query.scope.MainModule$1.next(MainModule.java:104) at org.basex.core.cmd.AQuery.query(AQuery.java:109) at org.basex.core.cmd.XQuery.run(XQuery.java:22) at org.basex.core.Command.run(Command.java:257) at org.basex.core.Command.execute(Command.java:93) at org.basex.api.client.LocalSession.execute(LocalSession.java:132) at org.basex.api.client.Session.execute(Session.java:36) at org.basex.core.CLI.execute(CLI.java:92) at org.basex.BaseX.<init>(BaseX.java:107) at org.basex.BaseX.main(BaseX.java:43)
The exception does not occur if 'cache' is set to 'false'.
Relatedly, if I amend the query to this:
for $doc in (<a/>,<b/>,<c/>) return try{ xslt:transform( $doc, <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version='2.0'> <xsl:template match='/'> <xsl:sequence select='if(a) then error(xs:QName("err"), "oops") else .'/> </xsl:template> </xsl:transform>, map{}, map{'cache':'true'} ) } catch * {<err>{$err:description}</err>}
the error message is passed through for the first item in the sequence (<a/>), but is lost, resulting in <err/> when adjusted to error on subsequent items (<b/> or <c/>).
Again, this works as expected if the transformer is not cached.
Thanks and regards, Andrew
https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail Virus-free. www.avast.com https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>