两个不同类型的XML元素在XSD中重复无限次?

问题描述 投票:2回答:2

假设我使用了ab元素的序列。 aaType类型,bbType类型。

<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文档,其序列同时具有aTypebType的elems类型,我会收到错误。是否可以按顺序允许使用两种类型的任意数量的元素?我想要允许的是这样的:

 <seq><a/><a/><b/><a/><b/><b/></seq>
xml xsd
2个回答
1
投票

您显示的内容模型应匹配可替换为a元素的一个或多个元素的任何序列,后跟一个或多个可替换为b的元素。

但是,你说,你想匹配一系列ab元素,混合。您当前声明中至少需要更改两件事,然后:

  • 如果允许ab元素出现在有效文件中,则它们不是抽象的;你应该停止说他们是。
  • 如果输入中的<a/><a/><b/>之类的序列可以有效地跟随更多的ab元素,则需要允许xsd:sequence元素定义的序列重复;将xsd:sequence/@maxOccurs更改为大于1的整数或unbounded是必要的。
  • 如果ab元素的混合集合可以以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已经提出的内容模型;对于他们都认识的语言,大多数读者会发现重复选择比重复序列更清晰,所有成员都是可选的。

1
投票

首先,如果要在文档中实例化abstract="true"a,请删除b

然后,将maxOccurs="unbounded"放在xs:choice上:

<xs:choice maxOccurs="unbounded">
    <xs:element ref="a"/>
    <xs:element ref="b"/>
</xs:choice>

允许ab被允许重复出现,例如你在评论中显示:

<a/><a/><b/><a/><b/><b/>
© www.soinside.com 2019 - 2024. All rights reserved.