How we solved this in EMIX:
<xs:element name="contractType" type="power:ContractTypeType"/>
<xs:simpleType name="ContractTypeType">
<xs:union memberTypes="power:ContractTypeEnumeratedType emix:EmixExtensionType"/>
</xs:simpleType>
<xs:simpleType name="ContractTypeEnumeratedType">
<xs:restriction base="xs:string">
<xs:enumeration value="FullRequirementsPower"/>
<xs:enumeration value="FullRequirementsPowerWithDemandCharge"/>
<xs:enumeration value="FullRequirementsPowerWithMaximumAndMinimum"/>
<xs:enumeration value="HourlyDayAheadEx-AnteRealTimePrice"/>
<xs:enumeration value="TimeOfUsePricing"/>
<xs:enumeration value="TransportService"/>
<xs:enumeration value="CongestionRevenueRights"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="EmixExtensionType">
<xs:annotation>
<xs:documentation>Pattern used for extending string enumeration, where allowed</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="x-\S.*"/>
</xs:restriction>
</xs:simpleType>
This defines a general extension pattern (x-*), and a known list, and defines the valid enumerations as the union of the two. It also restricts the extensions to strings only, and not a rational for tunnelling.
This is in part editorial and in part schema and model related. Please comment.