假设我使用了一系列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
类型的ele,则会出错。是否可以按顺序允许使用两种类型的任意数量的元素?我想要允许的是这样的:
<seq><a/><a/><b/><a/><b/><b/></seq>
答案 0 :(得分:1)
首先,如果要在文档中实例化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/>
答案 1 :(得分:1)
您展示的内容模型应匹配可替换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已经提出的内容模型;对于他们都认识的语言,大多数读者会发现重复选择比重复序列更清晰,所有成员都是可选的。