- From: <bugzilla@jessica.w3.org>
- Date: Mon, 28 Sep 2015 13:40:43 +0000
- To: public-qt-comments@w3.org
https://www.w3.org/Bugs/Public/show_bug.cgi?id=29120
--- Comment #5 from Abel Braaksma <abel.braaksma@xs4all.nl> ---
> <xsl:merge-source for-each-stream="doc.xml" select="/*/*">
> <xsl:merge-key select="last() - 825"/>
This is interesting. My instinct says this should be forbidden. Checking out
the rules once more, I see that for streamability we do not prohibit anything
in xsl:merge-key. That means that:
<xsl:merge-key select="../foo" />
is allowed. Considering that we take a snapshot, one could argue that this is
essentially a grounded expression that will always select the empty sequence,
but that hardly constitutes the principle of least surprise, and is isn't
helping any useful case I can think of.
My proposal would be to add an extra rule to guaranteed-streamable rules for
xsl:merge-source, something like:
5. Every select expression of child xsl:merge-keys has a striding or
grounded posture and a motionless or consuming sweep when assessed
with the context item type and posture of the select expression of
the parent xsl:merge-source.
This rule will also take care of erroneous use of the fn:last() function, which
is not allowed in a striding posture.
As presently written it does not take care of a context item type other than
nodes (i.e. atomic types or function items), which, if we are keeping this
disallowed because of fn:snapshot, is better if we statically prohibit it to
make the streaming rules apply to all allowed cases (if not, then the fn:last()
function would be allowed if xsl:merge-source selects non-nodes, only to hit a
dynamic error later with fn:snapshot).
-----
> <xsl:for-each select="copy-of(/*/transaction)">
> <xsl:value-of select="last()"/>
> </xsl:for-each>
While this exact construct is not problematic, it becomes problematic with
/*/transaction/copy-of(). I have reported that separately: bug 29153, comment
0.
> 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.
No, I think we can statically determine whether or not the context-size is
requested. In the case of binding a variable to the last() function, don't we
already have a restriction on this (in the sense that binding to
focus-dependent functions is disallowed)? But since this then becomes a
*dynamic* function call, a dynamic error when invoking such a dynamic function
call seems appropriate.
The alternative is to:
- ban fn:last()
- ban function-lookup
- ban all and any dynamic function calls
- ban inline functions (they can contain fn:last)
this seems a bit too much killing a mosquito with a bazooka ;).
--
You are receiving this mail because:
You are the QA Contact for the bug.
Received on Monday, 28 September 2015 13:40:52 UTC