1

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

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

4

1 回答 1

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>

但我不确定它是否比根元素中的选择更好 - 只是因为这样也可以将“包”和“类”直接作为根元素。就我个人而言,我更喜欢一个有(虽然更大)选择的根元素。

于 2013-07-18T06:17:46.253 回答