Как указать (XSD) элемент имеет под тег или простой контент - но не оба - PullRequest
1 голос
/ 02 октября 2009

Редактировать: Это не мой последний вопрос, потому что я больше не хотел задавать оба вопроса одновременно.

Я хочу указать, что мой узел настройки имеет:

   <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 ]

4 голосов
/ 02 октября 2009

Я думаю, что ближе всего вы получите 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>

Это позволяет вам иметь комбинацию простого контента и a value element.

С этой схемой следующий 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>
    

Возможность (3) определенно не идеальна, но я не думаю, что вы можете избежать этого. Вам нужно будет иметь правило, которое имеет дело с этой ситуацией. Я думаю, что разумным правилом было бы: если присутствует элемент value, используйте данные между тегами value, в противном случае используйте данные между тегами setting.

1 голос
/ 02 октября 2009

Эти типы ограничений невозможно описать в XSD, вам нужно использовать другой язык для их моделирования, например, Schematron.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...