事實證明,XSD包含一個功能,它完全做到了這一點 - 將兩種或更多種類型相結合 - 而我完全錯過了它。 A union
創建一個類型,其詞彙空間覆蓋所有成員類型的詞彙空間(換句話說,它可以包含與其任何子類型匹配的值)。
由於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>