如何指定(XSD)元素具有子标记或简单内容 - 但不是两者都有

时间:2009-10-02 01:39:16

标签: xsd

编辑:这不是我最后一个问题的愚蠢,因为我不想再同时做这两件事。

我想指定我的设置节点具有:

   <setting name='Some Setting'>
      SomeData
    </setting>
架构是:

  <xs:element name="setting">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="name" type="xs:string" use="required" />
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <setting name='Some Setting'>
    <value>SomeData</value>
  </setting>
架构是:

<xs:element minOccurs="0" name="setting">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="value" type="xs:string" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>

但不是两者。

我无法弄清楚如何在整体架构中将它们组合在一起。 我尝试使用<xs:choice />但是抱怨说具有相同名称的元素必须属于同一类型

2 个答案:

答案 0 :(得分:4)

我认为你最接近的是使用mixed="true",如下所示:

<xs:complexType>
  <xs:sequence>
    <xs:element name="setting">
      <xs:complexType mixed="true">
        <xs:sequence>
          <xs:element name="value" type="xs:string" minOccurs="0" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

这允许您将简单内容组合成value元素。

使用此模式,以下XML将被视为有效:

  1. 仅限简单内容:

    <setting name="Some Setting">SomeData</setting>
    
  2. 仅限子元素:

    <setting name="Some Setting">
      <value>SomeData</value>
    </setting> 
    
  3. 这两种:

    <setting name="Some Setting">
      Some Data
      <value>SomeData</value>
    </setting>
    
  4. (3)的可能性绝对不理想,但我认为你不能避免它。您需要有一个处理这种情况的规则。我认为合理的规则是:如果存在value元素,请使用value标记之间的数据,否则使用setting标记之间的数据。

答案 1 :(得分:1)

这些类型的限制无法在XSD中描述,您需要使用其他语言对其进行建模,例如: Schematron的。