XSD - 使用不同的ID属性定义多个必需元素,其中一个元素具有子元素

时间:2011-11-18 15:41:21

标签: xml xsd

我正在尝试为一些看起来大致如此的XML开发XSD:

<root>
  <thing id="1"/>
  <thing id="2"/>
  <thing id="3">
    <subelement>
      ...
    </subelement>
  </thing>
</root>

每个id需要一次,而id为“3”的东西需要特定的子元素。

我能够通过创建一个抽象的复杂类型并扩展它来创建每个ID的一个要求(虽然它仍未经过测试),

<xs:element name="thing" type="tns:abstractType" minOccurs="3" maxOccurs="3">
  <xs:unique name="EachIdRequired">
    <xs:selector xpath="thing" />
    <xs:field xpath="@id"/>
  </xs:unique>
</xs:element>

<xs:complexType name="abstractType" abstract="true/>
<xs:complexType name="idOne">
  <xs:complexContent>
    <xs:extension base="tns:abstractType">
      <xs:attribute name="id" fixed="1" type="xs:integer" use="required"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="idTwo">
  <xs:complexContent>
    <xs:extension base="tns:abstractType">
      <xs:attribute name="id" fixed="2" type="xs:integer" use="required"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="idThree">
  <xs:complexContent>
    <xs:extension base="tns:abstractType">
      <xs:attribute name="id" fixed="3" type="xs:integer" use="required"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

但是,我不确定如何要求id {的complexType也具有所需的子元素。我看到使用属性和子元素定义的元素的唯一方法是使用扩展,但是idThree已经扩展了抽象类型。

我可以用其他方式获得什么?我很怀疑,但我想确定。 XSD似乎有些限制。

1 个答案:

答案 0 :(得分:1)

XML Schema中不可能。这种结构的最佳Schema语言是Relax NG。见http://relaxng.org/