<xs:element> 可以在顶层声明(低于xs:schema),但它不能有minOccurs 或maxOccurs,因为没有上下文就没有任何意义。如果它是根元素,则它只能有一个元素,如果不是,则该信息指的是父元素的上下文。这是合法的:
<xs:schema ...>
<xs:element name="parameters">...</xs:element>
...
</xs:schema>
但这不是:
<xs:schema ...>
<xs:element name="parameters" maxOccurs="1" minOccurs="0">...</xs:element>
...
</xs:schema>
您可以参考组内的顶级xs:element,例如xs:sequence。在这里您可以使用这些属性,因为现在您有了一个上下文(该组中允许多少个)。这是合法的:
<xs:schema ...>
<xs:element name="parent">
<xs:complexType>
<xs:sequence>
<xs:element ref="parameters" maxOccurs="1" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="parameters">
<xs:complexType>
<xs:all>
<xs:element ref="p" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
...
</xs:schema>
这里<parent> 是<parameters> 出现的上下文,所以你可以说它在那里允许出现多少次。 <parameters> 的定义是全局的,您可以使用 ref 属性来引用它。
如果您永远不需要重用parameters,或者如果您永远不会将parameters 作为root,您不需要它在顶层并且可以将它嵌套在您的parent 定义中。在这种情况下,您可以将name 属性与minOccurs 和maxOccurs 一起使用。
<xs:schema ...>
<xs:element name="parent">
<xs:complexType>
<xs:sequence>
<xs:element name="parameters" maxOccurs="1" minOccurs="0" />
<xs:complexType>
<xs:all>
<xs:element ref="p" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
...
</xs:schema>
您也可以引用顶级类型。重用、扩展和限制类型更为常见,因此这也是定义元素的有效(且推荐)方式:
<xs:schema ...>
<xs:element name="parent">
<xs:complexType>
<xs:sequence>
<xs:element name="parameters" type="ParameterType" maxOccurs="1" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="ParameterType">
<xs:all>
<xs:element ref="p" minOccurs="0"/>
</xs:all>
</xs:complexType>
...
</xs:schema>