- From: <bugzilla@jessica.w3.org>
- Date: Thu, 11 Jun 2015 14:09:17 +0000
- To: public-qt-comments@w3.org
https://www.w3.org/Bugs/Public/show_bug.cgi?id=28791
Bug ID: 28791
Summary: [xslt 3.0] Streamabiity of simple mapping operator
Product: XPath / XQuery / XSLT
Version: Last Call drafts
Hardware: PC
OS: All
Status: NEW
Severity: normal
Priority: P2
Component: XSLT 3.0
Assignee: mike@saxonica.com
Reporter: mike@saxonica.com
QA Contact: public-qt-comments@w3.org
The semantics of A!B in XPath and <xsl:for-each select="A"/><xsl:sequence
select="B"/></xsl:for-each> in XSLT are identical, so it is surprising to find
that the streamability rules are very different.
For the bang operator we say:
<quote>
The posture and sweep of the expression are the posture and sweep of the
right-hand operand, assessed with a context posture and type set to the posture
and type of the left-hand operand.
</quote>
while for xsl:for-each, excluding things that aren't relevant e.g. xsl:sort, we
say:
<quote>
1. If the select expression is grounded, then the posture and sweep of the
xsl:for-each instruction follow the general streamability rules, with the
operand roles and their usages as follows:
1a. The select expression (the operand usage is irrelevant, but can be taken as
inspection)
1b. The contained sequence constructor (usage transmission). This is a
higher-order operand; its context posture is grounded.
2. If the posture of the select expression is crawling and the sweep of the
contained sequence constructor is consuming, then roaming and free-ranging.
3. Otherwise:
3a. The posture of the instruction is the posture of the contained sequence
constructor, assessed with the context posture and context item type set to the
posture and type of the select expression.
3b. The sweep of the instruction is the wider of the sweep of the select
expression and the sweep of the contained sequence constructor.
</quote>
The differences are:
(a) rule 1, which handles the case where the LHS is grounded, is missing for
the bang operator. It is potentially needed to handle cases where the RHS is
not dependent on the focus, but is not motionless; but all examples I can see
where this would come into play, like (1 to 5)!current-group() are covered by
existing rules. We need to watch for (1 to 5)!$x where £x is a reference to a
streaming parameter of a streamable stylesheet function. As far as I can see,
if this rule is needed for xsl:for-each, then it is also needed for the bang
operator, and indeed for "/".
(b) I can't see anything disallowed by rule 2 that isn't also disallowed by
rule 3a.
(c) Rule 3b is blatantly different from the rule for the bang operator. I think
the rule for bang is seriously wrong here. Consider "author!." or
"author!name()" - the "wider sweep" rule would give us consuming, but the
current rule gives us motionless.
I suggest that we fix all of this by saying for the bang operator: "The sweep
and posture of the expression A!B (where A and B are arbitrary expressions) are
the same as the sweep and posture of the construct <xsl:for-each
select="A"/><xsl:sequence select="B"/></xsl:for-each>: see section a.b.c.d."
Then at least we know they are consistent.
--
You are receiving this mail because:
You are the QA Contact for the bug.
Received on Thursday, 11 June 2015 14:09:20 UTC