Creating Union Types

A union type references two or more datatypes. The valid content of a union type is a value from one of those datatypes. We’ll create another schema that defines a list of zipcodes, then create a union type that allows the states attribute to be either a list of state abbreviations or a list of zipcodes. Here’s an excerpt from the schema:

<?xml version="1.0" encoding="UTF-8"?>
<!-- union.xsd -->
...
  <xs:simpleType name="zipcode">
    <xs:restriction base="xs:integer">
      <xs:pattern value="[0-9]{5}"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="zipcode-list-type">
    <xs:list itemType="zipcode"/>
  </xs:simpleType>

  <xs:simpleType name="state-abbr-type">
    <xs:restriction base="xs:string">
      <xs:length value="2"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="state-abbr-list-type">
    <xs:list itemType="state-abbr-type"/>
  </xs:simpleType>

  <xs:simpleType name="address-union-type">
    <xs:union memberTypes="state-abbr-list-type zipcode-list-type"/>
  </xs:simpleType>
  ...
  <xs:element name="priorAddresses">
    <xs:complexType>
      <xs:attribute name="states" type="address-union-type"/>
    </xs:complexType>
  </xs:element>

</xs:schema>

And here’s a valid document for this schema:

<?xml version="1.0" encoding="utf-8"?>
<!-- union.xml -->
<person
  xmlns="http://www.oreilly.com/xslt"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.oreilly.com/xslt union.xsd">
  <name>Doug Tidwell</name>
  <birthday>1965-06-19</birthday>
  <age>42</age>
 <priorAddresses ...

Get XSLT, 2nd Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.