[xquery-talk] Union types

Srdjan Djuricic sdjuricic at galdosinc.com
Fri Jan 12 16:32:28 PST 2007

Thanks Michael for you answer, I appreciate it.

Just a quick note, I could not resort to the following:
string(pbs:myProp) = "1999-12-31T12:00:00"

In case that this dateTime contained the timeZone then string comparison
would not work.


-----Original Message-----
From: Michael Kay [mailto:mike at saxonica.com] 
Sent: Friday, January 12, 2007 4:11 PM
To: Srdjan Djuricic; talk at x-query.com
Subject: RE: [xquery-talk] Union types 

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

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