在xsd:all之后重复元素

时间:2014-03-21 11:00:46

标签: xml xsd

我想询问是否可以在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之后不能有一个元素,我怎么能实现这个呢?

1 个答案:

答案 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>

如果仅存在pricename,这将使验证失败,但如果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)如果您不想以任何顺序允许namesprices,而且还允许不平衡的对,并且 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> 不同,但根据您的需要,其中一个或某些组合可能符合您的需求。