Optimizer rewrites expression so that stylesheet is not streamable
Added by Martin Honnen about 7 years ago
When I run the stylesheet
with @Saxon-EE 9.8.0.4J@ from the command line it compiles the stylesheet fine, starts to run it with streaming as it indicates with e.g.
Processing file:/C:/SomePath/test2017100201.xml Streaming file:/C:/SomePath/test2017100201.xml
and then aborts processing with the error
Error on line 20 of test201710020106.xsl: XTSE3430: Template rule is not streamable * Operand {@attribute()} of {let $vv:v0 := ...} selects streamed nodes in a context that allows arbitrary navigation (line 21) Template rule is not streamable * Operand {@attribute()} of {let $vv:v0 := ...} selects streamed nodes in a context that allows arbitrary navigation ( line 21)
As that cited expression doesn't seem to exist in the stylesheet I tried to run with @-opt:0@ to disable the optimizer and then the stylesheet runs through fine with streaming.
Is there any way other than with @-opt:0@ to prevent Saxon from rewriting the @xsl:value-of@ to be no longer streamable?
A sample input is
Replies (1)
RE: Optimizer rewrites expression so that stylesheet is not streamable - Added by Michael Kay about 7 years ago
I can repeat this failure..
It's useful in such cases to run with -explain, which shows the main rewrites done by the optimizer:
OPT : At line 12 of file:/Users/mike/Desktop/temp/test.xsl OPT : Pre-evaluated function call fn:tokenize(...) OPT : Expression after rewrite: ("id", "dummyAttr1", "dummyAttr2", "dummyAttr3", "dummyAttr4") OPT : At line 21 of file:/Users/mike/Desktop/temp/test.xsl OPT : Lifted (@attribute()) above ((xsl:value-of, ...)) on line 21 OPT : Expression after rewrite: let $Q{http://saxon.sf.net/generated-variable}v0 := attribute::attribute() return (Block(ValueOf(string-join(for $col in $columns return (concat(atomizeSingleton($Q{http://saxon.sf.net/generated-variable}v0[(name(.)) eq $col]), "")), ",")), ValueOf(" ")))
The problem is that the rewritten code binds a variable to a streamed node, which isn't allowed. Armed with this knowledge, you can work around the problem by suppressing loop-lifting optimizations with -opt:-l
Clearly rewriting streamable code to non-streamable form is against the rules so I'll have to find some way to prevent this.
Raised and resolved here: https://saxonica.plan.io/issues/3465
Please register to reply