- From: <bugzilla@jessica.w3.org>
- Date: Mon, 28 Sep 2015 10:42:48 +0000
- To: public-qt-comments@w3.org
https://www.w3.org/Bugs/Public/show_bug.cgi?id=29120 --- Comment #4 from Michael Kay <mike@saxonica.com> --- Our streamability rules for xsl:merge currently impose no constraints on what you can write in xsl:merge-action; this is on the theory that the context item for xsl:merge-action is grounded (it's a sequence delivered by snapshot()). Although there's a good case for allowing test="position() eq last()" so one can detect the last group in the sequence of groups, permitting last() without restrictions would allow <xsl:merge-action> <xsl:if test="last() = 27186">...</xsl:if> </xsl:merge-action> which requires knowledge of the number of groups even when processing the first group. As I mentioned, Saxon is actually handling this, by reading all the input twice, but I don't think this comes within our usual definition of streaming. The problems are slightly different when it comes to computing a merge key. Here we are currently allowing <xsl:merge-source for-each-stream="doc.xml" select="/*/*"> <xsl:merge-key select="last() - 825"/> where we can't compute the merge key without knowing the number of items in the input. The problems with last() actually go beyond xsl:merge. Consider: <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. I think this is consistent with our general approach - we also allow reverse(copy-of(/*/*)) - so in effect we're saying if you use copy-of on a streamed input sequence, the system may need to hold the entire result of copy-of in memory. But with xsl:merge, where we do an implicit snapshot(), holding the entire sequence of snapshots in memory would destroy the whole point. I'm not sure whether comment #2 is suggesting that we make use of last() in these situations a dynamic error. That would be very different from our usual approach where streamability violations are detected statically. -- You are receiving this mail because: You are the QA Contact for the bug.
Received on Monday, 28 September 2015 10:42:51 UTC