[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

> -----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