Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Element minOccurs maxOccurs


Автор: Agentx86 30.11.2010, 14:59
Не могу решить задачу. Есть два элемента.
Код

  <xs:element name="onWillAppear" type="command"   />
   <xs:element name="onDidAppear" type="command"   />


И есть еще
Код

  <xs:element name="navigationBar" type="navigationBar"/>
  <xs:element name="toolbar" type="toolbar"/>
 <xs:element name="searchBar" type="searchBar"/>
 <xs:element name="sqlDataSet" type="sqlDataSet"/>


Нужно так сделать чтобы первые два элемента могли встречаться максимум по одному разу миниум ноль и не могли быть друг в друга вложены.Но в них могут быть вложены остальные элементы navigationBar, toolbar, searchBar, sqlDataSet сколько угодно раз в любой последовательности или не одного. Также эти элементы могут быть не вложены не одного раза

Автор: LSD 30.11.2010, 16:04
Ну тут не совсем понятно, что за тип такой command. А в общем это будет выглядеть так:
Код

  <xs:element name="onWillAppear" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="navigationBar" type="navigationBar"  minOccurs="0"/>
        <xs:element name="toolbar" type="toolbar" minOccurs="0"/>
        <xs:element name="searchBar" type="searchBar" minOccurs="0"/>
        <xs:element name="sqlDataSet" type="sqlDataSet" minOccurs="0"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

Автор: Agentx86 30.11.2010, 19:33
В общем я понял, что мою задачу решить нельзя. А все потому что нельзя засунуть choice в all.
Допустим есть три элемента. 1,2,3,
Элемент 1 может встречаться сколько угодно раз и где угодно. А 2,3 только по одному разу. Вот примеры.

1,2,3,1
1,1,1,2,1,1,3,1,1
1,1,2,1,1,1,
1,1,3,1,1
2,1,1,3
3,1,1

Сомневаюсь, что возможно написать XSD схему для таких комбинаций. Но если возможно то пишите идеи.

Автор: LSD 1.12.2010, 14:55
Цитата(Agentx86 @  30.11.2010,  20:33 Найти цитируемый пост)
Сомневаюсь, что возможно написать XSD схему для таких комбинаций.

Не только можно, но тут еще более одного способа.

Если элемент 2 идет всегда перед 3, то пишешь:
Код

      <xs:sequence>
        <xs:element name="1" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="2" minOccurs="0"/>
        <xs:element name="1" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="3" minOccurs="0"/>
        <xs:element name="1" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>


Если нужно чтобы 2 и 3 могли встречаться в любой последовательности есть два варианта:
1. choice из двух sequence перечисленных выше с разным порядком 2 и 3 (плохо подходит если элементов станет больше)
2. 
Код

      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="1"/>
        <xs:element name="2"/>
        <xs:element name="3"/>
      </xs:choice>

плюс ограничение уникальности на элементы 2 и 3.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)