Saxon 12 J crashes on fn:transform with base-output-uri:'urn:to-string' with java.lang.NullPointerException while SaxonCS 12 runs the code
Added by Martin Honnen almost 2 years ago
Due to shortcomings of the SaxonC Python API to capture serialized result documents I started playing with using XPath and fn:transform
instead to run XSLT 3, on experimenting with that I have found an interesting case where SaxonCS 12 runs the code fine while SaxonJ 12 crashes out with a NullPointerException.
So the code calls fn:transform
and allows you to set the base-output-uri
, I experimented with a non hierarchic one like urn:to-string
and SaxonCS swallows that fine while SaxonJ crashes.
Here is the (XQuery) code:
declare namespace map = "http://www.w3.org/2005/xpath-functions/map";
declare namespace array = "http://www.w3.org/2005/xpath-functions/array";
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:method 'json';
declare option output:indent 'yes';
declare variable $base-output-uri as xs:string? external := ();
let $stylesheet-text := ``[<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" expand-text="yes">
<xsl:output method="xml" indent="yes"/>
<xsl:template name="xsl:initial-template">
<main-template>
<xsl:for-each select="1 to 3">
<creating-xml-result>{.}</creating-xml-result>
<xsl:result-document href="result-{.}.xml" method="xml" indent="yes">
<xsl:document>
<root>
<xsl:for-each select="1 to .">
<item>{.}</item>
</xsl:for-each>
</root>
</xsl:document>
</xsl:result-document>
<creating-json-result>{.}</creating-json-result>
<xsl:result-document href="result-{.}.json" method="json" indent="yes">
<xsl:sequence
select="map { 'name' : 'result ' || ., 'data' : array { 1 to . } }"/>
</xsl:result-document>
<xsl:result-document href="result-adaptive{.}.txt" method="adaptive" indent="yes">
<xsl:sequence
select="map { 'name' : 'result ' || ., 'data' : 1 to . }"/>
</xsl:result-document>
</xsl:for-each>
</main-template>
</xsl:template>
</xsl:stylesheet>]``
return
if (empty($base-output-uri))
then
transform(map{ "stylesheet-text": $stylesheet-text, "delivery-format": "serialized" })
else
transform(map{ "stylesheet-text": $stylesheet-text, "delivery-format": "serialized", "base-output-uri": trace($base-output-uri) })
Stack trace with Saxon Java 12 HE:
PS C:\Users\marti\OneDrive\Documents\xslt\blog-xslt-3-by-example\fn-transform-output-methods> java -cp 'C:\Program Files\Saxonica\SaxonHE12-0J\saxon-he-12.0.jar' net.sf.saxon.Query .\initial-template-test0.xq base-output-uri=urn:to-string
* [1]: xs:string: urn:to-string
java.lang.NullPointerException
at net.sf.saxon.functions.TransformFn$SerializedDeliverer.resolve(TransformFn.java:1216)
at net.sf.saxon.expr.instruct.ResultDocument.makeReceiver(ResultDocument.java:530)
at net.sf.saxon.expr.instruct.ResultDocument.processLeft(ResultDocument.java:480)
at net.sf.saxon.expr.instruct.ResultDocument.processInstruction(ResultDocument.java:401)
at net.sf.saxon.Configuration.processResultDocument(Configuration.java:2336)
at net.sf.saxon.expr.instruct.ResultDocument$ResultDocumentElaborator.lambda$elaborateForPush$0(ResultDocument.java:977)
at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:898)
at net.sf.saxon.expr.instruct.ForEach$ForEachElaborator.lambda$elaborateForPush$4(ForEach.java:706)
at net.sf.saxon.expr.instruct.FixedElement$FixedElementElaborator.lambda$elaborateForPush$0(FixedElement.java:653)
at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:274)
at net.sf.saxon.trans.XsltController.callTemplate(XsltController.java:872)
at net.sf.saxon.s9api.Xslt30Transformer.callTemplate(Xslt30Transformer.java:486)
at net.sf.saxon.functions.TransformFn.call(TransformFn.java:811)
at net.sf.saxon.expr.SystemFunctionCall$SystemFunctionCallElaborator.lambda$elaborateForPull$1(SystemFunctionCall.java:608)
at net.sf.saxon.expr.elab.PullElaborator.lambda$elaborateForPush$0(PullElaborator.java:38)
at net.sf.saxon.expr.instruct.Choose$ChooseExprElaborator.lambda$elaborateForPush$11(Choose.java:1176)
at net.sf.saxon.query.XQueryExpression.processQuery(XQueryExpression.java:499)
at net.sf.saxon.query.XQueryExpression.run(XQueryExpression.java:473)
at net.sf.saxon.s9api.XQueryEvaluator.run(XQueryEvaluator.java:464)
at net.sf.saxon.Query.runQuery(Query.java:975)
at net.sf.saxon.Query.doQuery(Query.java:444)
at net.sf.saxon.Query.main(Query.java:106)
Error in xsl:result-document/@href on line 7 column 82
Exception thrown by output resolver
java.lang.NullPointerException
at net.sf.saxon.functions.TransformFn$SerializedDeliverer.resolve(TransformFn.java:1216)
at net.sf.saxon.expr.instruct.ResultDocument.makeReceiver(ResultDocument.java:530)
at net.sf.saxon.expr.instruct.ResultDocument.processLeft(ResultDocument.java:480)
at net.sf.saxon.expr.instruct.ResultDocument.processInstruction(ResultDocument.java:401)
at net.sf.saxon.Configuration.processResultDocument(Configuration.java:2336)
at net.sf.saxon.expr.instruct.ResultDocument$ResultDocumentElaborator.lambda$elaborateForPush$0(ResultDocument.java:977)
at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:898)
at net.sf.saxon.expr.instruct.ForEach$ForEachElaborator.lambda$elaborateForPush$4(ForEach.java:706)
at net.sf.saxon.expr.instruct.FixedElement$FixedElementElaborator.lambda$elaborateForPush$0(FixedElement.java:653)
at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:274)
at net.sf.saxon.trans.XsltController.callTemplate(XsltController.java:872)
at net.sf.saxon.s9api.Xslt30Transformer.callTemplate(Xslt30Transformer.java:486)
at net.sf.saxon.functions.TransformFn.call(TransformFn.java:811)
at net.sf.saxon.expr.SystemFunctionCall$SystemFunctionCallElaborator.lambda$elaborateForPull$1(SystemFunctionCall.java:608)
at net.sf.saxon.expr.elab.PullElaborator.lambda$elaborateForPush$0(PullElaborator.java:38)
at net.sf.saxon.expr.instruct.Choose$ChooseExprElaborator.lambda$elaborateForPush$11(Choose.java:1176)
at net.sf.saxon.query.XQueryExpression.processQuery(XQueryExpression.java:499)
at net.sf.saxon.query.XQueryExpression.run(XQueryExpression.java:473)
at net.sf.saxon.s9api.XQueryEvaluator.run(XQueryEvaluator.java:464)
at net.sf.saxon.Query.runQuery(Query.java:975)
at net.sf.saxon.Query.doQuery(Query.java:444)
at net.sf.saxon.Query.main(Query.java:106)
at template xsl:initial-template on line 3 column 47
nullQuery failed with dynamic error: Exception thrown by output resolver
Not being able to resolve the relative xsl:result-document hrefs against the base-output-uri urn:to-string
might be the right thing but I guess you don't want to crash with a NullPointerException.
But as I said, SaxonCS does manage to run the code:
PS C:\Users\marti\OneDrive\Documents\xslt\blog-xslt-3-by-example\fn-transform-output-methods> & 'C:\Program Files\Saxonica\SaxonCS-12.0\SaxonCS.exe' query .\initial-template-test0.xq base-output-uri=urn:to-string
...
* [1]: xs:string: urn:to-string
{
"urn:result-1.xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n <item>1<\/item>\n<\/root>\n",
"urn:result-2.xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n <item>1<\/item>\n <item>2<\/item>\n<\/root>\n",
"urn:result-3.xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n <item>1<\/item>\n <item>2<\/item>\n <item>3<\/item>\n<\/root>\n",
"urn:to-string": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<main-template>\n <creating-xml-result>1<\/creating-xml-result>\n <creating-json-result>1<\/creating-json-result>\n <creating-xml-result>2<\/creating-xml-result>\n <creating-json-result>2<\/creating-json-result>\n <creating-xml-result>3<\/creating-xml-result>\n <creating-json-result>3<\/creating-json-result>\n<\/main-template>\n",
"urn:result-1.json": "{\n \"data\": [ 1 ],\n \"name\": \"result 1\"\n}",
"urn:result-2.json": "{\n \"data\": [ 1, 2 ],\n \"name\": \"result 2\"\n}",
"urn:result-3.json": "{\n \"data\": [ 1, 2, 3 ],\n \"name\": \"result 3\"\n}",
"urn:result-adaptive1.txt": "map{\"data\":1,\"name\":\"result 1\"}",
"urn:result-adaptive2.txt": "map{\"data\":(1,2),\"name\":\"result 2\"}",
"urn:result-adaptive3.txt": "map{\"data\":(1,2,3),\"name\":\"result 3\"}"
}
Replies (3)
Please register to reply
RE: Saxon 12 J crashes on fn:transform with base-output-uri:'urn:to-string' with java.lang.NullPointerException while SaxonCS 12 runs the code - Added by Michael Kay almost 2 years ago
Indeed, I would expect that supplying a non-hierarchic base URI should lead to a clean error message saying that a relative URI can't be resolved; I wouldn't expect it to lead to an NPE.
RE: Saxon 12 J crashes on fn:transform with base-output-uri:'urn:to-string' with java.lang.NullPointerException while SaxonCS 12 runs the code - Added by Norm Tovey-Walsh almost 2 years ago
Indeed, I would expect that supplying a non-hierarchic base URI should lead to a clean
error message saying that a relative URI can't be resolved; I wouldn't expect it to lead
to an NPE.
I did fix an NPE in the resolver just last weekend or thereabouts. Alas,
just after we shipped Saxon 12.
Martin, can you try it against XML Resolver 4.6.4 and see if it is fixed?
Be seeing you,
norm
--
Norm Tovey-Walsh
Saxonica
RE: Saxon 12 J crashes on fn:transform with base-output-uri:'urn:to-string' with java.lang.NullPointerException while SaxonCS 12 runs the code - Added by Martin Honnen almost 2 years ago
I tried but it doesn't appear to have changed anything:
PS C:\Users\marti\OneDrive\Documents\xslt\blog-xslt-3-by-example\fn-transform-output-methods> java -cp 'C:\Program Files\Saxonica\SaxonHE12-0J\saxon-he-12.0.jar;C:\Users\marti\Downloads\xmlresolver-4.6.4.jar;C:\Users\marti\Downloads\xmlresolver-4.6.4-data.jar' net.sf.saxon.Query .\initial-template-test0.xq base-output-uri=urn:to-string
* [1]: xs:string: urn:to-string
java.lang.NullPointerException
at net.sf.saxon.functions.TransformFn$SerializedDeliverer.resolve(TransformFn.java:1216)
at net.sf.saxon.expr.instruct.ResultDocument.makeReceiver(ResultDocument.java:530)
at net.sf.saxon.expr.instruct.ResultDocument.processLeft(ResultDocument.java:480)
at net.sf.saxon.expr.instruct.ResultDocument.processInstruction(ResultDocument.java:401)
at net.sf.saxon.Configuration.processResultDocument(Configuration.java:2336)
at net.sf.saxon.expr.instruct.ResultDocument$ResultDocumentElaborator.lambda$elaborateForPush$0(ResultDocument.java:977)
at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:898)
at net.sf.saxon.expr.instruct.ForEach$ForEachElaborator.lambda$elaborateForPush$4(ForEach.java:706)
at net.sf.saxon.expr.instruct.FixedElement$FixedElementElaborator.lambda$elaborateForPush$0(FixedElement.java:653)
at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:274)
at net.sf.saxon.trans.XsltController.callTemplate(XsltController.java:872)
at net.sf.saxon.s9api.Xslt30Transformer.callTemplate(Xslt30Transformer.java:486)
at net.sf.saxon.functions.TransformFn.call(TransformFn.java:811)
at net.sf.saxon.expr.SystemFunctionCall$SystemFunctionCallElaborator.lambda$elaborateForPull$1(SystemFunctionCall.java:608)
at net.sf.saxon.expr.elab.PullElaborator.lambda$elaborateForPush$0(PullElaborator.java:38)
at net.sf.saxon.expr.instruct.Choose$ChooseExprElaborator.lambda$elaborateForPush$11(Choose.java:1176)
at net.sf.saxon.query.XQueryExpression.processQuery(XQueryExpression.java:499)
at net.sf.saxon.query.XQueryExpression.run(XQueryExpression.java:473)
at net.sf.saxon.s9api.XQueryEvaluator.run(XQueryEvaluator.java:464)
at net.sf.saxon.Query.runQuery(Query.java:975)
at net.sf.saxon.Query.doQuery(Query.java:444)
at net.sf.saxon.Query.main(Query.java:106)
Error in xsl:result-document/@href on line 7 column 82
Exception thrown by output resolver
java.lang.NullPointerException
at net.sf.saxon.functions.TransformFn$SerializedDeliverer.resolve(TransformFn.java:1216)
at net.sf.saxon.expr.instruct.ResultDocument.makeReceiver(ResultDocument.java:530)
at net.sf.saxon.expr.instruct.ResultDocument.processLeft(ResultDocument.java:480)
at net.sf.saxon.expr.instruct.ResultDocument.processInstruction(ResultDocument.java:401)
at net.sf.saxon.Configuration.processResultDocument(Configuration.java:2336)
at net.sf.saxon.expr.instruct.ResultDocument$ResultDocumentElaborator.lambda$elaborateForPush$0(ResultDocument.java:977)
at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:898)
at net.sf.saxon.expr.instruct.ForEach$ForEachElaborator.lambda$elaborateForPush$4(ForEach.java:706)
at net.sf.saxon.expr.instruct.FixedElement$FixedElementElaborator.lambda$elaborateForPush$0(FixedElement.java:653)
at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:274)
at net.sf.saxon.trans.XsltController.callTemplate(XsltController.java:872)
at net.sf.saxon.s9api.Xslt30Transformer.callTemplate(Xslt30Transformer.java:486)
at net.sf.saxon.functions.TransformFn.call(TransformFn.java:811)
at net.sf.saxon.expr.SystemFunctionCall$SystemFunctionCallElaborator.lambda$elaborateForPull$1(SystemFunctionCall.java:608)
at net.sf.saxon.expr.elab.PullElaborator.lambda$elaborateForPush$0(PullElaborator.java:38)
at net.sf.saxon.expr.instruct.Choose$ChooseExprElaborator.lambda$elaborateForPush$11(Choose.java:1176)
at net.sf.saxon.query.XQueryExpression.processQuery(XQueryExpression.java:499)
at net.sf.saxon.query.XQueryExpression.run(XQueryExpression.java:473)
at net.sf.saxon.s9api.XQueryEvaluator.run(XQueryEvaluator.java:464)
at net.sf.saxon.Query.runQuery(Query.java:975)
at net.sf.saxon.Query.doQuery(Query.java:444)
at net.sf.saxon.Query.main(Query.java:106)
at template xsl:initial-template on line 3 column 47
nullQuery failed with dynamic error: Exception thrown by output resolver
Please register to reply