Re: [xsl] Question on grouping and streaming in XSLT 3: difference between Saxon 9.6 EE and online version of Exselt

Subject: Re: [xsl] Question on grouping and streaming in XSLT 3: difference between Saxon 9.6 EE and online version of Exselt
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 17 Jan 2015 18:19:43 -0000
Logged as a bug here:

https://saxonica.plan.io/issues/2292

and I've added the test case to the W3C test suite (assuming your consent...)

You're quite right that this isn't streamable according to the W3C rules, and
Saxon should report a compile-time error.

Streamed grouping has been one of the toughest things to make work, both in
Saxon and in the W3C spec. In fact, while Saxon 9.6 generally uses
streamability rules that are now quite closely aligned with the W3C spec, this
isn't yet the case for grouping, partly because we've been finding bugs in
both.

Saxon's streaming strategy is generally:

(1) test the code statically against the W3C streamability rules.

(2) generate code for streamed execution

(3) execute that code

In principle, if we do (1) correctly, then failures should never occur at
stages (2) or (3). In practice, a failure sometimes occurs at stage (2)
because there are things W3C allows that Saxon does not yet implement; and a
failure sometimes occurs at stage (3) simply because with streaming, there are
an awful lot of things that can go wrong and we still only have a couple of
thousand test cases.

Michael Kay
Saxonica
mike@xxxxxxxxxxxx
+44 (0) 118 946 5893




On 17 Jan 2015, at 10:35, Martin Honnen martin.honnen@xxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

>
> I am trying to explore the use of streaming with various grouping
approaches, mainly with Saxon 9.6 EE, but for comparison I also run examples
through the online version of Exselt http://exselt.net/demo.
>
> So far, when I used <xsl:mode streamable="yes"/> to make the whole code use
streaming Saxon threw an error on stylesheet compilation if a construct or
expression breaking streamability rules was used (for instance "The
group-adjacent expression is not motionless").
>
> However with a test case using
>
>  group-starting-with="record[foo = 'a']"
>
> Saxon does compile the stylesheet but then gives various warnings during the
execution that "  SXST0061: An error occurred matching pattern {record[foo =
'a']}: Navigation using child axis is not supported from a streamed input
node". and produces a wrong transformation result.
>
> I understand the problem with that pattern and the "foo" child axis access
but I wonder whether it should be found as an error during compilation, as in
the other examples I tried.
>
> Exselt does run the stylesheet and produces the wanted result but I have no
way of seeing whether it built a tree or not.
>
> Here are the samples, the stylesheet is
>
> <xsl:stylesheet version="3.0"
>  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>  xmlns:xs="http://www.w3.org/2001/XMLSchema";
>  exclude-result-prefixes="xs">
>
> <xsl:mode streamable="yes"/>
>
> <xsl:output indent="yes"/>
>
> <xsl:template match="root">
>  <xsl:copy>
>    <xsl:for-each-group select="record" group-starting-with="record[foo =
'a']">
>      <group>
>        <xsl:copy-of select="current-group()"/>
>      </group>
>    </xsl:for-each-group>
>  </xsl:copy>
> </xsl:template>
>
> </xsl:stylesheet>
>
> an input sample is
>
> <root>
>  <record>
>    <foo>a</foo>
>    <bar>1</bar>
>  </record>
>  <record>
>    <foo>b</foo>
>    <bar>2</bar>
>  </record>
>  <record>
>    <foo>a</foo>
>    <bar>3</bar>
>  </record>
>  <record>
>    <foo>b</foo>
>    <bar>4</bar>
>  </record>
>  <record>
>    <foo>a</foo>
>    <bar>5</bar>
>  </record>
>  <record>
>    <foo>a</foo>
>    <bar>6</bar>
>  </record>
>  <record>
>    <foo>c</foo>
>    <bar>7</bar>
>  </record>
> </root>
>
> the output I want is
>
> <root>
>   <group>
>      <record>
>         <foo>a</foo>
>         <bar>1</bar>
>      </record>
>      <record>
>         <foo>b</foo>
>         <bar>2</bar>
>      </record>
>   </group>
>   <group>
>      <record>
>         <foo>a</foo>
>         <bar>3</bar>
>      </record>
>      <record>
>         <foo>b</foo>
>         <bar>4</bar>
>      </record>
>   </group>
>   <group>
>      <record>
>         <foo>a</foo>
>         <bar>5</bar>
>      </record>
>   </group>
>   <group>
>      <record>
>         <foo>a</foo>
>         <bar>6</bar>
>      </record>
>      <record>
>         <foo>c</foo>
>         <bar>7</bar>
>      </record>
>   </group>
> </root>
>
> the one Saxon 9.6 EE gives is
>
> <root>
>   <group>
>      <record>
>         <foo>a</foo>
>         <bar>1</bar>
>      </record>
>      <record>
>         <foo>b</foo>
>         <bar>2</bar>
>      </record>
>      <record>
>         <foo>a</foo>
>         <bar>3</bar>
>      </record>
>      <record>
>         <foo>b</foo>
>         <bar>4</bar>
>      </record>
>      <record>
>         <foo>a</foo>
>         <bar>5</bar>
>      </record>
>      <record>
>         <foo>a</foo>
>         <bar>6</bar>
>      </record>
>      <record>
>         <foo>c</foo>
>         <bar>7</bar>
>      </record>
>   </group>
> </root>
>
> but as I said, with various warnings that something went wrong, of the form
>
> Warning: on line 11 of test2015011607.xsl:
>  SXST0061: An error occurred matching pattern {record[foo = 'a']}:
Navigation using child axis is not supported from a streamed input node

Current Thread