XSD:应该声明某个类型中唯一一个元素

时间:2011-11-04 10:32:03

标签: xml xsd

假设我有一个PetCage元素应该只包含一个AnimalElement类型:

<PetCage>
    <Cat Name="Kitty">
</PetCage>

<PetCage>
    <Dog Name="Buddy">
</PetCage>

CatDog都属于AnimanlElement类型。如何在XSD中表达所述规则?

2 个答案:

答案 0 :(得分:2)

您需要的是架构中的choice element。它允许您表示只有一组元素中的一个可能出现。

编辑:您需要直接通过name指定元素的名称,或者通过ref指定其他地方定义的元素。

据我所知,唯一的选择是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:element name="PetCage">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="animal" type="Animal" minOccurs="1" maxOccurs="1"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="Animal" abstract="true">
        <xs:attribute name="Name" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="Cat">
        <xs:complexContent>
            <xs:extension base="Animal"></xs:extension>
        </xs:complexContent>
    </xs:complexType>

</xs:schema>

这将验证如下形式的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<PetCage>
    <animal xsi:type="Cat" Name="String"/>
</PetCage>

不幸的是,这会让您与animal元素名称绑定。我怀疑XML Schema允许您指定特定类型,并允许您使用通配符作为名称。 XML Schema基于元素名称进行验证,如果元素使用抽象类型定义,则xsi:type属性。有xs:any声明,但不能与任何特定类型绑定。以下内容将尽可能验证,但仍允许使用在模式根目录下定义的任何元素:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:element name="PetCage">
        <xs:complexType>
            <xs:sequence>
                <xs:any processContents="strict" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="Animal" abstract="true">
        <xs:attribute name="Name" type="xs:string" />
    </xs:complexType>

    <xs:element name="cat" />
    <xs:complexType name="Cat">
        <xs:complexContent>
            <xs:extension base="Animal"></xs:extension>
        </xs:complexContent>
    </xs:complexType>

</xs:schema>

它会正确验证这一点:

<?xml version="1.0" encoding="UTF-8"?>
<PetCage>
    <cat Name="snookums"/>
</PetCage>

...但它不会阻止你将PetCage放入PetCage。

我希望熟悉XML Schema规范的人能够确认这是正确的,或者最好是提供所需的解决方案。

答案 1 :(得分:2)

<xs:complexType name="PetCage">
    <xs:choice>
         <xs:element name="Cat" type="AnimanlElement" />
         <xs:element name="Dog" type="AnimanlElement" />
    </xs:choice>
</xs:complexType>
<!-- AnimanlElement definition -->
<xs:complexType name="AnimanlElement">
    <xs:attribute name="Name" type="xs:string" />
</xs:complexType>

更多信息:http://www.w3schools.com/Schema/el_choice.asp