[xquery-talk] Union types
Michael Kay
mike at saxonica.com
Sat Jan 13 00:10:57 PST 2007
There's a bit of a gap in the spec here: support for union types is not
particularly good. It would be nice to allow a cast directly to a union type
(or a castable test, for that matter). It would also be nice if you could
directly compare an element/attribute having a union type with a value
belonging to one of its member types without the risk of a type error.
Doing a sequence of "castable" tests as Jim suggested is one solution but it
does replicate a lot of detail from the schema into the query.
I thought another way to do it would be to have a global element e declared
in the schema with the required union type as its type, and then do
pbs:myProp = validate{ <e>{"1999-12-31T12:00:00"}</e> }
Unfortunately this give you a type error rather than false if pbs:myProp is
not a dateTime. To get round this, use
index-of(pbs:myProp, validate{ <e>{"1999-12-31T12:00:00"}</e> }) = 1
Of course if the lexical spaces of the member types of the union are
disjoint (for example with union(date, time, dateTime)) a much easier
solution is to do
string(pbs:myProp) = "1999-12-31T12:00:00"
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: talk-bounces at x-query.com
> [mailto:talk-bounces at x-query.com] On Behalf Of Srdjan Djuricic
> Sent: 12 January 2007 21:00
> To: talk at x-query.com
> Subject: [xquery-talk] Union types
>
> Hello,
>
> I have a question regarding union types and how to deal with
> them. The simpleType in question is a union of "time
> dateTime anyURI decimal date gYearMonth gYear". When a user
> performs a query they specify an element name along with the
> literal value to do the comparison. Based on the schema we
> find out the element's primitive type and do a cast on the
> input literal's value. For example
>
> pbs:myProp = xs:dateTime("1999-12-31T12:00:00")
>
> The problem occurs if myProp is a simpleType with an union.
> I do not know how to cast the input data. I tried using
> "instance of" on the literal value operator but quickly found
> out that "1999-12-31T12:00:00"
> instance of xs:dateTime yields false. If I don't do any
> casting I get an exception.
>
> Are there any suggestion as to how to deal with this issue?
>
> Thanks,
>
> Srdjan
>
>
>
>
> _______________________________________________
> talk at x-query.com
> http://x-query.com/mailman/listinfo/talk
More information about the talk
mailing list