XSD:特定替代品的maxOccurs不同

时间:2013-07-11 12:00:30

标签: xml xsd

我有一个简单的XML结构,如下所示

...
<param>
  <name>foo</name>
  <type1>
     Some complex content
  </type1>
</param>
<param>
  <name>bar</name>
  <type2>
     Some complex content
  </type2>
</param>
...

我使用的架构看起来像这样

...
<xs:complexType name="par">
  <xs:sequence>
    <xs:element name="name" type="xs:string"/>
    <xs:element ref="typeSpecific"/>
  </xs:sequence>
</xs:complexType>

<xs:element name="typeSpecific" abstract="true"/>
<xs:element name="type1" type="t1" substitutionGroup="typeSpecific"/>
<xs:element name="type2" type="t2" substitutionGroup="typeSpecific"/>
...

我想扩展它,这样如果我在param中使用type1,我只能有一个这样的元素,但是如果我使用type2,我可以有很多,就像这样:

...
<param>
  <name>bar</name>
  <type2>
     Some complex content
  </type2>
  ...
  <type2>
     Some other complex content
  </type2>
</param>

由于兼容性问题,我想避免将type2元素包装在容器中。我的第一个冲动是使用maxOccurs="unbounded"属性<xs:element name="type2" type="t2" substitutionGroup="typeSpecific" maxOccurs="unbounded"/>,但这是不允许的。

有没有办法使用我当前的结构使用XSD强制执行此限制?我能以某种方式使用<xs:choice>代替替换来实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

XSD 1.0不允许一个元素的类型依赖于另一个元素的内容。

您可以使用断言在XSD 1.1中实现此类依赖项。

修改 您不能使用替换组执行此操作:如果元素彼此可替换,则两者的出现约束必须相同。您需要一个明确的内容模型,并在其中进行选择。