Xml XSD任何使用组的订单
我正在尝试为以下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 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不接受
序列的选择
:姓名、年龄或年龄、姓名),并对其进行排序。因为每个组中只有两个元素,所以不会发生爆炸(至少在这个代码段中是这样)。它仍然只是一个近似值,而不是您想要的任何顺序(并且不验证您给出的示例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>