- From: <bugzilla@jessica.w3.org>
- Date: Mon, 28 Sep 2015 13:35:13 +0000
- To: public-qt-comments@w3.org
https://www.w3.org/Bugs/Public/show_bug.cgi?id=29153 Bug ID: 29153 Summary: [XSLT30] have we created a loop-hole with windowed streaming and copy-of or snapshot? Product: XPath / XQuery / XSLT Version: Last Call drafts Hardware: PC OS: Windows NT Status: NEW Severity: normal Priority: P2 Component: XSLT 3.0 Assignee: mike@saxonica.com Reporter: abel.braaksma@xs4all.nl QA Contact: public-qt-comments@w3.org Target Milestone: --- This follows from the discussion in bug 29120, comment 4, where Michael wrote: > <xsl:for-each select="copy-of(/*/transaction)"> > <xsl:value-of select="last()"/> > </xsl:for-each> > Here last() is allowed because the context posture is grounded. But we have > the same problem, that in effect we have to materialize the entire result of > copy-of(), rather than pipelining it one item at a time. This does not pose a problem, because the whole argument will be consumed by copy-of(), but what if you rewrite this as the following, where the "consumation" should happen one element at a time? <xsl:for-each select="/*/transaction/copy-of(.)"> <xsl:value-of select="last()"/> </xsl:for-each> This is the "suggested" way of writing windowed streaming. Since we take a copy each time, the xsl:for-each gets a grounded posture. But the problem is not just with copy-of: <xsl:for-each select="for $x in */* return string(*)"> <xsl:value-of select="last()"/> </xsl:for-each> Which, imo, also suggests that the user intends to stream it, but the only way to know the value of fn:last() is by evaluating the whole tree. I checked the general streamability rules, and while we have exception rules for higher-order operands like xsl:for-each, they have no effect when the select expression selects a grounded result. I think that the only problem is with fn:last(), therefore I suggest we add a rule in section 19.8.9.14 Streamability of the last function along those lines (probably with a Note explaining why so): x) if the fn:last function appears at any depth inside a higher-order operand, then roaming and free-ranging. This has a few nasty side-effects, so perhaps we can do better. I.e., consider: a) a/b[last()] (should be prohibited) b) (1 to 10)[last()] (should be allowed) c) xsl:for-each/@select="copy-of(x)", the last() in seqtor (should be allowed?) d) same with xsl:iterate e) same with xsl:for-each-group f) (for $e in a/b return copy-of($e))[last()] (maybe allowed?) g) a/b/copy-of(x)[last()] (should be prohibited, though can be made streamable) Perhaps there are other scenarios to consider? In the event that we prohibit too much, someone can always create a copy of a node-set as a workaround and use count($x). -- You are receiving this mail because: You are the QA Contact for the bug.
Received on Monday, 28 September 2015 13:35:26 UTC