我想询问是否可以在xsd:all之后重复一个元素。像这样:
<xsd:complexType name="animal">
<xsd:all>
<xsd:element name="name" type="nameType"/>
<xsd:element name="price" type="salaryType"/>
</xsd:all>
<xsd:element name="note" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:complexType>
这是无效的,因为在xsd:all之后不能有一个元素,我怎么能实现这个呢?
答案 0 :(得分:1)
您不能element
作为complexType
的孩子。您需要all
内的sequence
组,但这也是非法的(all
必须是复杂类型的顶级,并且它也不能包含组 - 只有元素和参考)。所以all
过于局限,无法做到你想要的。
解决方案不是使用all
,而是使用不同的组并对其进行配置,使其行为类似于您声明的所有组。这是一些替代方案。您可以选择一个适合您的实验或稍微进行实验并适应一个。
1)choice
元素允许您从组中选择一个元素。使用choice
声明maxOccurs="unbounded"
组会产生类似的效果,然后您可以在choice
内嵌套sequence
获得您期望的效果:
<xsd:complexType name="animal">
<xsd:sequence>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="price" type="xsd:string"/>
</xsd:choice>
<xsd:element name="note" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
只有一个元素可供选择,但由于您可以拥有多个选项组,因此效果将允许您以任何顺序包含多个元素。它并非100%等同于all
:因为没有minOccurs
,您需要至少有一个price
或一个name
,但它不需要两者。这将是有效的:
<price></price>
<name></name>
<name></name>
<name></name>
<price></price>
<name></name>
<price></price>
<price></price>
<note></note>
<note></note>
<note></note>
和此:
<price></price>
<name></name>
但也是这样:
<price></price>
如果没有或只有note
,它将会失败。
2)如果您需要保证两个成对出现,那么您需要sequence
:
<xsd:sequence>
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="price" type="xsd:string"/>
</xsd:sequence>
<xsd:element name="note" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
如果仅存在price
或name
,这将使验证失败,但如果price
name
之前 name
,则会失败因为它强制执行订单。
3)如果您想在任何顺序中允许price
/ choice
对,您可以声明包含两个sequences
的{{1}} }:
<xsd:complexType name="animal">
<xsd:sequence>
<xsd:choice maxOccurs="unbounded">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="price" type="xsd:string"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element name="price" type="xsd:string"/>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:choice>
<xsd:element name="note" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
但这将允许任何顺序的名称/价格对。你仍然不能:
<price/>
<price/>
<name/>
4)如果您不想以任何顺序允许names
和prices
,而且还允许不平衡的对,并且否 names
或{{ 1}}或空prices
,然后你可以使用它:
animal
这些都与<xsd:element name="animal" type="animal" />
<xsd:complexType name="animal">
<xsd:sequence>
<xsd:sequence maxOccurs="unbounded" minOccurs="0">
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="price" type="xsd:string"/>
</xsd:sequence>
<xsd:sequence maxOccurs="unbounded" minOccurs="0">
<xsd:element name="price" type="xsd:string"/>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
<xsd:element name="note" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
不同,但根据您的需要,其中一个或某些组合可能符合您的需求。