In certain circumstances it is necessary to add elements to an existing NIEM enumeration (or code list). In these situations one may choose to simply recreate a new list with all the same elements already defined in a NIEM code type and simply add those which do not yet exist. However, when the code list is larger than a few elements (such as a state code list with at least 50 valid values), using xsd:union as an option becomes more appealing.
The xsd:union provides a way to combine simple data types together to form a larger and more comprehensive data type. An example would be simply adding “ZZ” to a list of US Postal Service State (USPS) Codes to communicate an unknown or invalid state. This can be accomplished by extending the existing USPS code list in several steps.
Step 1 – Create a New Simple Type With New Values
<!-- Simple code value to add ZZ as a valid value -->
<xsd:simpletype name="USStateCodeDefaultSimpleType">
<xsd:restriction base="xsd:token">
<xsd:enumeration value="ZZ">
<xsd:annotation>
<xsd:documentation>UNKNOWN</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
</xsd:restriction>
</xsd:simpletype>
Step 2 – Use xsd:union to Join the Values with Existing Values
<!-- New simple time combining my custom enum with the standard usps one -->
<xsd:simpleType name="LocationStateCodeSimpleType">
<xsd:union memberTypes="usps:USStateCodeSimpleType my:USStateCodeDefaultSimpleType"/>
</xsd:simpleType>
Step 3 – Wrap the New Simple Data Type in a Complex Type
<!-- New complexType required to add s:id and s:idref to the definition -->
<xsd:complexType name="LocationStateCodeType">
<xsd:simpleContent>
<xsd:extension base="aoc_code:LocationStateCodeSimpleType">
<xsd:attributeGroup ref="s:SimpleObjectAttributeGroup"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
Step 4 – Create Element Instantiating the New Code List
<!-- Element declaration allowing use of our new data type -->
<xsd:element name="NewStateCode" type="my:LocationStateCodeType" substitutionGroup="nc:LocationStateCode"/>
Now any place an nc:LocationStateCode can be use, our extended code list can be used instead.