- From: Abel Braaksma <abel.braaksma@xs4all.nl>
- Date: Thu, 22 Sep 2016 14:28:32 +0200
- To: "Public XSLWG" <public-xsl-wg@w3.org>
- Message-ID: <156801d214cc$d5a6ad80$80f40880$@xs4all.nl>
I am revisiting certain aspects of our type system, esp. w.r.t. lazy evaluation and I was wondering about the following:
<xsl:variable name="errors" select="1,2,error(xs:QName('err:test3')),4,error(xs:QName('err:test5'))" />
<xsl:try>
<xsl:for-each select="$errors">
<xsl:try>
<xsl:sequence select="." />
<xsl:catch>
<xsl:sequence select=" 'lazy-throw' " />
</xsl:catch>
</xsl:try>
</xsl:for-each>
<xsl:catch>
<xsl:sequence select="'eager-throw'" />
</xsl:catch>
</xsl:try>
The question is: does the for-each do the evaluation here and should it throw when it encounters the third element, or does the xsl:sequence do the evaluation, and it will throw twice, leading to output (1,2,'lazy-throw',4,'lazy-throw'), or is this implementation defined?
I think the latter: implementation-defined/dependent, since the order of execution is undefined and we may say argue that the items in the sequence only get evaluated once inside the body of the for-each. Of course, an implementation may choose to do so earlier on and raise the error *outside* the try/catch, leading to a single output (because of rollback) of 'eager-throw'.
And if this isn't in a final state (i.e., if the code segment is itself wrapped inside a variable), it may never show 'lazy-throw', or 'eager-throw', depending on how that variable is used later on.
On the flip side, I don't think there is an implementation-independent way of getting only the non-error items in the sequence, as on each access, even on declaration of the variable, eager evaluation *may* already throw, leading to the whole code segment to blow up.
Cheers,
Abel
Received on Thursday, 22 September 2016 12:29:11 UTC