派生类型是否有办法为XML Schema中的父元素赋值?

时间:2015-02-03 17:10:49

标签: xml xsd

我们说我有以下架构:

<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>

如果没有,是否至少可以修改父元素的限制,以创建例如父元素的元素。一条五条腿的狗不可能?

1 个答案:

答案 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指定为属性,则确实可能具有隐含的腿数。只需将AnimalTypeAnimalWith2LegsTypeAnimalWith4LegsType的定义更改为:

<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建模为属性以实现您想要的效果。