- From: Michael Kay <mike@saxonica.com>
- Date: Tue, 29 Sep 2015 19:07:03 +0100
- To: "Robie, Jonathan" <jonathan.robie@emc.com>
- Cc: Abel Braaksma <abel.braaksma@xs4all.nl>, Public Joint XSLT XQuery XPath <public-xsl-query@w3.org>
>
> I think there are some important differences between xs:error and 0.
>
> 0 is a value. It can be assigned to variables and used in expressions. If xs:error is the result of any operation, it is an error, not a value that can be used in expressions.
Eh? xs:error is a type. The result of an expression cannot be a type.
>
> And if I take your analogy seriously, we should allow division by xs:error. I don't think you are suggesting that.
Indeed not. I don’t know what it means to divide by a type.
> We allow division by zero because we allow division by a numeric value, and don't want to create lots of special cases. But xs:error is not a value that can occur.
>
> The simplest fix really might be to say that xs:error, used as a SequenceType, is always a type error.
That would be removing a feature.
For example, one can imagine implementing a schema processor by generating XQuery code from the XSD source. It would then be very natural for the code for conditional type assignment, when it encounters the XSD construct
<xs:element name="message" type="messageType">
<xs:alternative test="@kind='string'" type="messageTypeString"/>
<xs:alternative test="@kind='base64'" type="messageTypeBase64"/>
<xs:alternative type=“xs:error"/>
</xs:element>
to generate a query along the lines
declare function A($x as messageTypeString) {
$x
};
declare function B($x as messageTypeBase64) {
$x
};
declare function C($x as xs:error) {
$x
};
if (@kind = ‘string’) then A(.)
else if (@kind = ‘base64’) then B(.)
else C(.)
It’s perfectly reasonable to have a type with no instances, and we’ve designed it carefully so it behaves in a completely standard way (exactly like a user-defined type with no instances). It doesn’t need any special rules. §2.5.7 should be saying “it is a consequence of rules defined elsewhere that…”. The last sentence "A variable binding with a type declaration xs:error always raises a type error.” should be changed to “Matching any value against the sequence type xs:error (for example when calling a function or binding a variable) always fails.”
I would also be inclined to remove the sentence "xs:error offers an alternative way of raising errors, in addition to fn:error.” because it implies some kind of recommendation. Dividing by zero is another alternative way of raising errors, but I don’t think it’s one we would want to recommend.
Michael Kay
Saxonica
Received on Tuesday, 29 September 2015 18:07:31 UTC