继承的复杂类型中的元素顺序

时间:2013-02-20 20:08:57

标签: xml xsd complextype

我有一个用于验证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放在别处而不是顶部。

我希望能够使用该元素而无需担心序列。有办法吗?

1 个答案:

答案 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>

我省略了选择元素的子元素的出现指标,因为它们对接受的语言没有影响:当包含的选择(或包含它的序列)是可选的时,它们必然是可选的;当含有的选择可以这样做时,它们必须无限制地重复。