0

我有一个用于验证 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 放在顶部以外的地方。

我希望能够使用该元素而不必担心序列。有没有办法这样做?

4

1 回答 1

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>

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

于 2013-02-20T22:50:34.123 回答