如何将xsd:sequence与xsd:all混合使用

时间:2011-09-14 17:34:20

标签: xml xsd

我需要要求前n个元素在一个序列中,后跟几个可以按任何顺序排列的元素。

例如,让我们说我有这个xml:

<root>
    <person>
        <fn>First name</fn>
        <ln>Last Name</ln>
        <gender>F</gender>
        <age>33</age>
        <middleName>Middle</middleName>
    </person>
</root>

我需要要求有2个第一个元素,必须是 按照确切的顺序, 其次是3个元素,这3个可以按任意顺序排列。

我尝试了这个,但它似乎不是一个有效的架构xml:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="person">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="fn" minOccurs = "1" maxOccurs="1" type="xsd:string"/>
                <xsd:element name="ln" minOccurs = "1" maxOccurs="1" type="xsd:string"/>
            </xsd:sequence>

            <xsd:all>
                <xsd:element name="gender" minOccurs = "1" maxOccurs="1"/>
                <xsd:element name="age" minOccurs = "1" maxOccurs="1"/>
                <xsd:element name="middleName" minOccurs = "1" maxOccurs="1"/>
            </xsd:all>

        </xsd:complexType>
    </xsd:element>

</xsd:schema>

1 个答案:

答案 0 :(得分:2)

无法直接完成。

您可以使用xsd:choice替换xsd:all,该选项允许三个元素的可能的8个排列,这对于三个元素来说几乎可以管理,但是很快就变得难以处理。

在XSD 1.1中,我建议使用xsd:all内容模型,然后使用断言限制它。

但是,我也会质疑为什么你想用这种方式设计你的文档。在XSD不允许你做某事的地方,通常是因为XSD的设计者并不认为这是一件非常聪明的事情。