事实证明,XSD 包含一个功能正是这样做的——结合了两种或多种类型——而我只是错过了它。Aunion
创建一个类型,其词法空间覆盖其所有成员类型的词法空间(换句话说,它可以包含与其任何子类型匹配的值)。
需要注意的是IDREF
s 不能包含前导#
(它是对 ID 的直接引用,而不是 URL 的片段标识符),以下模式将验证示例 XML。有趣的是AnchorType
和TreeReferenceType
。
<schema targetNamespace="urn:x-ample:ui" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ui="urn:x-ample:ui">
<element name="ui" type="ui:UIType"/>
<complexType name="UIType">
<sequence>
<element minOccurs="1" maxOccurs="unbounded" name="block" type="ui:BlockType"/>
</sequence>
</complexType>
<complexType name="BlockType">
<attribute use="optional" name="id" type="ID"/>
<attribute name="anchor" type="ui:AnchorType"/>
</complexType>
<simpleType name="AnchorType">
<union memberTypes="ui:TreeReferenceType IDREF"/>
</simpleType>
<simpleType name="TreeReferenceType">
<restriction base="string">
<enumeration value="parent"/>
<enumeration value="previous"/>
<enumeration value="next"/>
</restriction>
</simpleType>
</schema>