- From: <bugzilla@jessica.w3.org>
- Date: Wed, 30 Sep 2015 02:11:47 +0000
- To: public-qt-comments@w3.org
https://www.w3.org/Bugs/Public/show_bug.cgi?id=29153
--- Comment #5 from Abel Braaksma <abel.braaksma@xs4all.nl> ---
> "a value comparison or general comparison is allowed if one operand is
> position() and the other is last()" is easy enough to state,
Yes, I think you are right. Unfortunately, while pondering over it again, I
think it cannot be done (I hope to be wrong though) because of accumulators.
Consider:
<xsl:accumulator name="count" initial-value="0">
<xsl:accumulator-rule match="*" select="$value + 1" />
</xsl:accumulator>
<xsl:template match="/">
<xsl:for-each select="*/special/copy-of()">
<xsl:if test="position() = last()">
<last>{accumulator-after()}</last>
</xsl:if>
<xsl:if test="position() != last()">
<elem>accumulator-after()</elem>
</xsl:if>
</xsl:for-each>
</xsl:template>
If the input stream is something like:
<root>
<special />
<foo />
<special />
<foo />
<foo />
... 1000's more w/o special ...
<foo />
<special />
</root>
Then the output should be something like:
<elem>2</elem>
<elem>4</elem>
<last>2038543</last>
However, upon visiting each <special>, the input stream must proceed to the
next <special> to peek whether or not the element is the last in the selection.
By doing so, the accumulator function is called, leading to a different
outcome, something like:
<elem>4</elem>
<elem>2038543</elem>
<last>2038543</last>
With non-streaming, this is not a problem, but with streaming, we lose the
accumulator value after visiting the node, to prevent that we have to keep
track of each and every accumulated value along the way (iirc).
--
You are receiving this mail because:
You are the QA Contact for the bug.
Received on Wednesday, 30 September 2015 02:11:53 UTC