您可以通过派生获得它。假设你有一个类型 Order 包含可选的 foo 和 bar:
<xs:complexType name="Order">
<xs:sequence>
<xs:element ref="foo" minOccurs="0"/>
<xs:element ref="bar" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
我假设您有一个支持不同服务的根元素:
<xs:element name="services">
<xs:complexType>
<xs:choice>
<xs:element name="serviceA" type="ServiceAType" />
<xs:element name="serviceB" type="ServiceBType" />
</xs:choice>
</xs:complexType>
</xs:element>
如果serviceB 允许可选的foo 和bar,您可以简单地将serviceB 的类型声明为Order,或者创建一个扩展Order 的ServiceBType:
<xs:complexType name="ServiceBType">
<xs:complexContent>
<xs:extension base="Order"/>
</xs:complexContent>
</xs:complexType>
如果您希望ServiceAType 限制Order 的内容,从而需要foo,那么您可以将其作为Order 的限制来实现:
<xs:complexType name="ServiceAType">
<xs:complexContent>
<xs:restriction base="Order">
<xs:sequence>
<xs:element ref="foo" minOccurs="1"/>
<xs:element ref="bar" minOccurs="0"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
现在您可以让<serviceB> 不包含任何元素,包含<foo>、<bar> 或<foo>,后跟<bar>。 <serviceA> 将允许 <foo> 后跟 <bar> 或 <foo>,但仅此而已。