我的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>
或者没有指定元素名称这是不可能的?
答案 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;可以直接作为根元素。就个人而言,我更喜欢一个具有(虽然更大)选择的根元素。