我们说我有以下架构:
<xs:schema targetNamespace="animals" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="animals">
<xs:complexType name="AnimalType" abstract="true">
<xs:sequence>
<xs:element name="legs" xml:base="xs:nonNegativeInteger"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="DogType">
<xs:complexContent>
<xs:extension base="AnimalType">
<xs:sequence>
<xs:element name="furColor" xml:base="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="BirdType">
<xs:complexContent>
<xs:extension base="AnimalType">
<xs:sequence>
<xs:element name="canFly" xml:base="xs:boolean"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
让我们假设所有的狗都有4条腿,所有的鸽子都有2条腿。是否可以将这些值设置为默认值,因此可以创建元素而不指定它们?
<!--a black dog with 4 legs-->
<dog>
<furColor>black</furColor>
</dog>
<!--a flightless bird with 2 legs-->
<bird>
<canFly>false</canFly>
</bird>
如果没有,是否至少可以修改父元素的限制,以创建例如父元素的元素。一条五条腿的狗不可能?
答案 0 :(得分:1)
我认为不可能有隐含的默认元素 legs
。但是,可以通过首先限制AnimalType
legs
然后扩展该限制类型来修改使五条腿狗无效的类型:
<xs:complexType name="AnimalType" abstract="true">
<xs:sequence>
<xs:element name="legs" type="xs:nonNegativeInteger"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="AnimalWith2LegsType" abstract="true">
<xs:complexContent>
<xs:restriction base="AnimalType">
<xs:sequence>
<xs:element name="legs">
<xs:simpleType>
<xs:restriction base="xs:nonNegativeInteger">
<xs:enumeration value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="AnimalWith4LegsType" abstract="true">
<xs:complexContent>
<xs:restriction base="AnimalType">
<xs:sequence>
<xs:element name="legs">
<xs:simpleType>
<xs:restriction base="xs:nonNegativeInteger">
<xs:enumeration value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="DogType">
<xs:complexContent>
<xs:extension base="AnimalWith4LegsType">
<xs:sequence>
<xs:element name="furColor" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="BirdType">
<xs:complexContent>
<xs:extension base="AnimalWith2LegsType">
<xs:sequence>
<xs:element name="canFly" type="xs:boolean"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="animals">
<xs:complexType>
<xs:sequence>
<xs:element name="dog" type="DogType"/>
<xs:element name="bird" type="BirdType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
这种方式的实例强制指定具有指定固定值的legs
元素:
<dog>
<legs>4</legs>
<furColor>black</furColor>
</dog>
<bird>
<legs>2</legs>
<canFly>false</canFly>
</bird>
如果将legs
指定为属性,则确实可能具有隐含的腿数。只需将AnimalType
,AnimalWith2LegsType
和AnimalWith4LegsType
的定义更改为:
<xs:complexType name="AnimalType" abstract="true">
<xs:sequence>
</xs:sequence>
<xs:attribute name="legs" type="xs:nonNegativeInteger"/>
</xs:complexType>
<xs:complexType name="AnimalWith2LegsType" abstract="true">
<xs:complexContent>
<xs:restriction base="AnimalType">
<xs:sequence>
</xs:sequence>
<xs:attribute name="legs" type="xs:nonNegativeInteger" fixed="2" use="optional"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="AnimalWith4LegsType" abstract="true">
<xs:complexContent>
<xs:restriction base="AnimalType">
<xs:sequence>
</xs:sequence>
<xs:attribute name="legs" type="xs:nonNegativeInteger" fixed="4" use="optional"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
现在您可以拥有包含以下内容的有效实例
<dog legs="4">
<furColor>black</furColor>
</dog>
<bird legs="2">
<canFly>false</canFly>
</bird>
和
<dog>
<furColor>black</furColor>
</dog>
<bird>
<canFly>false</canFly>
</bird>
除非您不打算指定多组腿(可能是caterpillars?),否则您需要将legs
建模为属性以实现您想要的效果。