Union types

A construct of the form union(type1, type2, type3) can be used to define simple unions of atomic types. For example, union(xs:base64Binary, xs:hexBinary) defines a union type whose members are xs:base64Binary and xs:hexBinary, while union(xs:date, xs:time, xs:dateTime) defines a union type whose members are xs:date, xs:time, and xs:dateTime. These types can conveniently be used in function signatures when writing a function that is designed to take arguments of more than one type.

The names between the parentheses are strictly QNames (not general ItemTypes) and must refer to named atomic types.

The order of member type names is significant, in that it determines the order used for casting or validating strings.

This construct can be used anywhere that a conventional union type name defined in a schema would be recognized, for example in instance of and cast as expressions, in the as attribute of variable and function declarations, or in typeswitch expressions. The semantics are exactly the same as if the union type were declared in an imported schema and referenced by name.

Two additional Saxon extensions help to improve the usability of union types:

For example, the following code defines an XQuery function that formats a date, time, dateTime, or a string in the form of a date, time, or dateTime using the appropriate variant of the format-date/time function:

declare function local:format( $in as union(xs:dateTime, xs:date, xs:time, xs:string), $fmt as xs:string) as xs:string { typeswitch ($in) case xs:dateTime return format-dateTime($in, $fmt) case xs:date return format-date($in, $fmt) case xs:time return format-time($in, $fmt) case xs:string return local:format($in cast as union(xs:dateTime, xs:date, xs:time), $fmt) default return error() }; local:format("2016-10-07", $fmt)