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

时间:2016-05-30 15:03:35

标签: xml xsd

假设我使用了一系列ab元素。 a的类型为aTypeb的类型为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文档的序列同时具有aTypebType类型的ele,则会出错。是否可以按顺序允许使用两种类型的任意数量的元素?我想要允许的是这样的:

 <seq><a/><a/><b/><a/><b/><b/></seq>

2 个答案:

答案 0 :(得分: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/>

答案 1 :(得分: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已经提出的内容模型;对于他们都认识的语言,大多数读者会发现重复选择比重复序列更清晰,所有成员都是可选的。