在XSD中指定具有常规子元素的根元素

时间:2013-07-18 05:51:47

标签: xml xsd

我的XSD中的所有子元素都有基类

<xs:complexType name="BaseItem">
    <xs:attribute name="id" type="string" use="required"/>
</xs:complexType>

这个元素的扩展者

<xs:complexType name="Package">
    <xs:complexContent>
        <xs:extension base="BaseItem">
            <xs:sequence>
                <xs:element name="SubElement" type="SubElementType"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="Class">
    <xs:complexContent>
        <xs:extension base="BaseItem">
            <xs:sequence>
                <xs:element name="SubElement2" type="SubElementType2"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
.......
etc....

此XSD的xml示例:

XML1: <Root><Package id="xxx"><SubElement/></Package></Root>

XML2: <Root><Class id="xxx"><SubElement2/></Class></Root>

XML3: <Root><Method id="xxx"><SubElement3/></Method></Root>

XML4: <Root><Method id="xxx"><SubElement3/></Method></Root>

如何在不定义所有可能的子项的情况下在此XSD中指定根元素?

<xs:element name="Root"> <xs:complexType> <xs:sequence> //????? </xs:sequence> </xs:complexType> </xs:element>

有没有办法通过基类型指定子项?不便:

<xs:element name="Root"> <xs:complexType> <xs:sequence> <element type="BaseItem"/> </xs:sequence> </xs:complexType> </xs:element>

或者没有指定元素名称这是不可能的?

1 个答案:

答案 0 :(得分:2)

您可以这样使用替换组(http://www.w3schools.com/schema/schema_complex_subst.asp

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:complexType name="base_item_type">
        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>

    <xs:complexType name="package_type">
        <xs:complexContent>
            <xs:extension base="base_item_type">
                <xs:sequence>
                    <xs:element name="SubElement" type="xs:string"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="class_type">
        <xs:complexContent>
            <xs:extension base="base_item_type">
                <xs:sequence>
                    <xs:element name="SubElement2" type="xs:string"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- abstract attribute to prevent occurence of BaseElement-->
   <xs:element name="BaseElement" type="base_item_type" abstract="true"/>

    <!-- Package and Class element might be used instead of BaseElement-->
    <!-- But they also can be put as root element -->
    <xs:element name="Package" type="package_type" substitutionGroup="BaseElement" /> 
    <xs:element name="Class" type="class_type" substitutionGroup="BaseElement"/>

    <!-- Root element -->
    <xs:element name="RootElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="BaseElement" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

但我不确定它是否比根元素中的选择更好 - 只是因为这样也是&#34; package&#34;和&#34;班&#34;可以直接作为根元素。就个人而言,我更喜欢一个具有(虽然更大)选择的根元素。