- From: <bugzilla@jessica.w3.org>
- Date: Mon, 21 Nov 2016 14:29:58 +0000
- To: public-qt-comments@w3.org
https://www.w3.org/Bugs/Public/show_bug.cgi?id=29984
--- Comment #3 from Michael Kay <mike@saxonica.com> ---
Here's an example where the relaxation in the rules would be useful. Test case
accumulator-009s has
<xsl:template match="/">
<result min="{accumulator-after('min')}" max="{accumulator-after('max')}"
sum="{accumulator-after('sum')}" count="{accumulator-after('count')}"
avg="{round(accumulator-after('sum') div accumulator-after('count'),
2)}"/>
</xsl:template>
Now, despite what I wrote in bug #30018, this is not guaranteed streamable.
Uder ยง19.8.9.1, (accumulator-after() is consuming if there is no preceding
INSTRUCTION that is consuming, therefore the literal result element has two
consuming operands. But if it is rewritten as
<xsl:element name="result">
<xsl:attribute name="min" select="accumulator-after('min')"/>
<xsl:attribute name="max" select="accumulator-after('max')"/>
...
then it become guaranteed streamable. And Saxon does this rewrite at a very
early stage of static analysis, long before streamability analysis.
Changing the rules to make the expression as originally written
guaranteed-streamable is not easy. The reason the rules for accumulator-after()
treat instructions and sequence constructors specially is that there is a
natural order of execution. The rules would also have to handle:
<xsl:template match="/">
<result min="{accumulator-after('min')}" size="{count(*)}"/>
</xsl:template>
where it is very difficult to define rules that ensure that accumulator-after
can be evaluated after the consuming count(*) expression.
--
You are receiving this mail because:
You are the QA Contact for the bug.
Received on Monday, 21 November 2016 14:30:05 UTC