我有一个用于验证XML文件的XSD架构。
在XSD架构中,我创建了一个包含属性组和选项的复杂类型,它本身包含“_output”,一个重复元素。
我的复杂类型:
<xs:complexType name="base_action">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="_output" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
<xs:attributeGroup ref="action"/>
</xs:complexType>
我还有其他元素(具有自己的子元素)继承自该复杂类型。
这种继承元素的例子:
<xs:element name="ex_elem" minOccurs="0">
<xs:complexType>
<xs:complexContent>
<xs:extension base="cockpit_base_action">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="to" minOccurs="0"/>
<xs:element name="from" minOccurs="0"/>
</xs:choice>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
现在,在XML中,这将起作用:
<ex_elem>
<_output/>
<from>0</from>
<to>1</to>
</ex_elem>
但不是这样:
<ex_elem>
<from>0</from>
<_output/>
<to>1</to>
</ex_elem>
或者这个:
<ex_elem>
<from>0</from>
<to>1</to>
<_output/>
</ex_elem>
据我所知,复杂类型的选择不能与继承元素的选择混在一起。这对我来说是一个问题,因为有些地方我想把_output放在别处而不是顶部。
我希望能够使用该元素而无需担心序列。有办法吗?
答案 0 :(得分:0)
在XSD 1.0中,基类型的任何扩展都会创建一个序列,其第一个成员是旧内容模型,其第二个成员是扩展添加到内容模型的顶部。所以你的cockpit_base_action扩展的有效内容模型是
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="_output"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:choice>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="to" minOccurs="0"/>
<xs:element name="from" minOccurs="0"/>
</xs:choice>
</xs:sequence>
在XSD 1.1中,您可以更改基本类型以使用xs:all,并在扩展名中使用xs:all,以获得所需的效果。
或(在1.0或1.1中),您可以更改扩展名以接受所需的语言。像这样的东西应该具有你想要的效果:
<xs:extension base="cockpit_base_action">
<xs:sequence minOccurs="0">
<xs:choice>
<xs:element name="to">
<xs:element name="from"/>
</xs:choice>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="_output"/>
<xs:element name="to">
<xs:element name="from"/>
</xs:choice>
</xs:sequence>
</xs:extension>
我省略了选择元素的子元素的出现指标,因为它们对接受的语言没有影响:当包含的选择(或包含它的序列)是可选的时,它们必然是可选的;当含有的选择可以这样做时,它们必须无限制地重复。