Xml XSD任何使用组的订单

Xml XSD任何使用组的订单,xml,xsd,Xml,Xsd,我正在尝试为以下XML构建XSD: <?xml version="1.0" encoding="UTF-8"?> <people xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="people.xsd"> <student> <name>John</name> <s

我正在尝试为以下XML构建XSD:

<?xml version="1.0" encoding="UTF-8"?>
<people xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="people.xsd">
    <student>
        <name>John</name>
        <study_year>4</study_year>
        <study_level>A+</study_level>
        <age>21</age>
    </student>
    <tutor>
        <name>Thomas</name>
        <salary>2300</salary>
        <age>45</age>
        <expertise>Math</expertise>
    </tutor>
    <student>
        <name>Mike</name>
        <study_level>B-</study_level>
        <age>20</age>
        <study_year>22</study_year>
    </student>
</people>

约翰
4.
A+
21
托马斯
2300
45
数学
迈克
B-
20
22
目前我有这个XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="people">
        <xs:complexType>
            <xs:sequence maxOccurs="1">
                <xs:choice maxOccurs="unbounded">
                    <xs:element maxOccurs="unbounded" minOccurs="1" name="student">
                        <xs:complexType>
                            <xs:sequence maxOccurs="1">
                                <xs:group ref="person"/>
                                <xs:element name="study_year"/>
                                <xs:element name="study_level"/>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                    <xs:element maxOccurs="unbounded" minOccurs="1" name="tutor">
                        <xs:complexType>
                            <xs:sequence maxOccurs="1">
                                <xs:group ref="person"/>
                                <xs:element name="salary"/>
                                <xs:element name="expertise"/>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:group name="person">
        <xs:sequence>
            <xs:element name="name"/>
            <xs:element name="age"/>
        </xs:sequence>
    </xs:group>
</xs:schema>

这只是我试图制作的XSD的一个抽象。 我想允许学生和导师之间的任何元素顺序。 我还需要xs:group,因为我不想要冗余

我试图用xs:all替换xs:sequence,但这不是有效的XSD

是否可以使用XSD执行此操作


感谢您的帮助

不幸的是,根据规范,在
all
中只能有
元素
s:

我不认为有一种方法可以做到你想要的(以任何顺序和只发生一次的方式计算出共同的名字和年龄元素)

例如,这里有两种不允许的近似方法:

  • 两个
    组的
    序列
    ?否,因为
    序列
    不能包含
    全部

  • 使用
    all
    扩展?不可以,因为
    all
    只能直接出现在
    组中
    complexType
    (扩展名不直接出现在组中)。虽然从规范上看,你可以作弊,把
    所有的
    放在一个组中,并引用扩展名中的内容,但是xerces不接受

但你可以做出三种不同的权衡来近似计算:

(1) 。明确列举的顺序(例如,
序列的
选择
:姓名、年龄或年龄、姓名),并对其进行排序。因为每个组中只有两个元素,所以不会发生爆炸(至少在这个代码段中是这样)。它仍然只是一个近似值,而不是您想要的任何顺序(并且不验证您给出的示例xml):


(2) 。或者,您可以放弃只需要一次,并使用允许任意数量的选择的老把戏-然后您可以考虑部分选择:

 <xs:choice maxOccurs="unbounded">
   <xs:group ref="person"/>
   <xs:element name="study_year"/>
   <xs:element name="study_level"/>
  </xs:choice>

 <xs:group name="person">
   <xs:choice>
     <xs:element name="name"/>
     <xs:element name="age"/>
   </xs:choice>
 </xs:group>

(3) 。因此,似乎最好放弃保理业务,满足于每次重复名称和年龄。(听起来你已经很不情愿地倾向于这一点了)

我的回答是:“不。”你想这么做是明智的,但我认为这是不可能的。我认为您必须在保理或订购/发生之间进行选择(即,各地名称/年龄重复;或要求订购;或不限制发生)

虽然这不是一个确定的答案,但希望通过探索这些选项,它能让您了解地形。也许这里一些更聪明的人可以建议一种变通方法,允许保理、非排序和只发生一次(或者给出一个明确的证据,证明没有这种变通方法是可能的)


PS:在任何人编辑这篇文章之前,我使用了
(1)。
编号而不是正确的枚举,因为SO格式化程序被它弄糊涂了,没有在第二点内提取xml代码。

非常感谢您的回答。我想我必须接受一个事实,那就是不可能做我想做的事。我选择方案3。我试过你建议的其他选择。我希望你的回答能对其他人有所帮助。
 <xs:choice maxOccurs="unbounded">
   <xs:group ref="person"/>
   <xs:element name="study_year"/>
   <xs:element name="study_level"/>
  </xs:choice>

 <xs:group name="person">
   <xs:choice>
     <xs:element name="name"/>
     <xs:element name="age"/>
   </xs:choice>
 </xs:group>