Альтернативна постановка питання, доданого в пізнішому редагуванні, все ще не відповідає: як вказати, що серед дітей елемента має бути одне ім’я child3
, одне ім’я child4
та будь-яке число, назване child1
або child2
, без обмежень для порядку в які з’являються діти.
Це прямо визначена регулярна мова, і потрібна вам модель змісту є ізоморфною звичайному виразу, що визначає набір рядків, у яких цифри "3" і "4" зустрічаються рівно один раз, а цифри "1" і "2" 'трапляються будь-яку кількість разів. Якщо це не очевидно, як це написати, це може допомогти подумати про те, яку машину з кінцевим станом ви побудували б для розпізнавання такої мови. Він матиме щонайменше чотири різних держави:
- початковий стан, в якому не було помічено ні "3", ні "4"
- проміжний стан, в якому бачили "3", але не "4"
- проміжний стан, у якому "4" було помічено, але не "3"
- остаточний стан, в якому були помічені і "3", і "4"
Незалежно від того, в якому стані знаходиться автомат, "1" і "2" можуть бути прочитані; вони не змінюють стан машини. У початковому стані також буде прийнято "3" або "4"; у проміжних станах приймається лише "4" або "3"; в остаточному стані не приймається ні "3", ні "4". Структуру регулярного виразу найлегше зрозуміти, якщо ми спочатку визначимо регулярний вираз для підмножини нашої мови, в якій зустрічаються лише "3" та "4":
(34)|(43)
Щоб дозволити "1" або "2" виникати будь-яку кількість разів у певному місці, ми можемо вставити (1|2)*
(або [12]*
якщо наша мова виразів приймає це позначення). Вставивши цей вираз у всіх доступних місцях, ми отримаємо
(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*
Перекласти це в змістову модель просто. Основна структура еквівалентна регулярному вираженню (34)|(43)
:
<xsd:complexType name="paul0">
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
Вставлення нуля або більше вибору child1
та child2
є простим:
<xsd:complexType name="paul1">
<xsd:sequence>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
Якщо ми хочемо трохи зменшити основну масу, ми можемо визначити іменовану групу для повторюваних варіантів child1
і child2
:
<xsd:group name="onetwo">
<xsd:choice>
<xsd:element ref="child1"/>
<xsd:element ref="child2"/>
</xsd:choice>
</xsd:group>
<xsd:complexType name="paul2">
<xsd:sequence>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:choice>
<xsd:sequence>
<xsd:element ref="child3"/>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child4"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="child4"/>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child3"/>
</xsd:sequence>
</xsd:choice>
<xsd:group ref="onetwo" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
У XSD 1.1 деякі обмеження на all
-групи були зняті, тому цю контент-модель можна визначити більш стисло:
<xsd:complexType name="paul3">
<xsd:all>
<xsd:element ref="child1" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child2" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="child3"/>
<xsd:element ref="child4"/>
</xsd:all>
</xsd:complexType>
Але як видно з наведених раніше прикладів, ці зміни до all
-груп насправді не змінюють виразної сили мови; вони лише роблять визначення певних мов більш коротким.