假设我使用了a
和b
元素的序列。 a
有aType
类型,b
有bType
类型。
<xs:sequence>
<xs:element ref="a" maxOccurs="unbounded"/>
<xs:element ref="b" maxOccurs="unbounded"/>
</xs:sequence>
...
<xs:element name="a" type="aType" abstract="true"/>
<xs:element name="b" type="bType" abstract="true"/>
如果我编写一个XML文档,其序列同时具有aType
和bType
的elems类型,我会收到错误。是否可以按顺序允许使用两种类型的任意数量的元素?我想要允许的是这样的:
<seq><a/><a/><b/><a/><b/><b/></seq>
您显示的内容模型应匹配可替换为a
元素的一个或多个元素的任何序列,后跟一个或多个可替换为b
的元素。
但是,你说,你想匹配一系列a
和b
元素,混合。您当前声明中至少需要更改两件事,然后:
a
和b
元素出现在有效文件中,则它们不是抽象的;你应该停止说他们是。<a/><a/><b/>
之类的序列可以有效地跟随更多的a
和b
元素,则需要允许xsd:sequence
元素定义的序列重复;将xsd:sequence/@maxOccurs
更改为大于1的整数或unbounded
是必要的。a
和b
元素的混合集合可以以b
开头,或者以a
结尾,那么您需要允许内容模型中的各个元素匹配实例中的零元素,因此:
<xs:sequence maxOccurs="unbounded">
<xs:element ref="a" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="b" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
这相当于kjhughes已经提出的内容模型;对于他们都认识的语言,大多数读者会发现重复选择比重复序列更清晰,所有成员都是可选的。首先,如果要在文档中实例化abstract="true"
和a
,请删除b
。
然后,将maxOccurs="unbounded"
放在xs:choice
上:
<xs:choice maxOccurs="unbounded">
<xs:element ref="a"/>
<xs:element ref="b"/>
</xs:choice>
允许a
和b
被允许重复出现,例如你在评论中显示:
<a/><a/><b/><a/><b/><b/>