Formulasi alternatif dari pertanyaan yang ditambahkan dalam pengeditan selanjutnya tampaknya masih belum terjawab: bagaimana menentukan bahwa di antara anak-anak elemen, harus ada satu yang dinamai child3
, satu nama child4
, dan nomor apa pun yang dinamai child1
atau child2
, tanpa batasan pada urutan di dimana anak-anak muncul.
Ini adalah bahasa reguler yang dapat didefinisikan langsung, dan model konten yang Anda butuhkan adalah isomorfik ke ekspresi reguler yang mendefinisikan kumpulan string di mana angka '3' dan '4' masing-masing muncul tepat satu kali, dan angka '1' dan '2 'terjadi beberapa kali. Jika tidak jelas bagaimana menulis ini, mungkin membantu untuk memikirkan jenis mesin keadaan terbatas apa yang akan Anda bangun untuk mengenali bahasa seperti itu. Ini akan memiliki setidaknya empat keadaan berbeda:
- keadaan awal di mana baik '3' maupun '4' tidak terlihat
- keadaan perantara di mana '3' telah terlihat tetapi tidak '4'
- keadaan perantara di mana '4' telah terlihat tetapi bukan '3'
- keadaan terakhir di mana '3' dan '4' telah terlihat
Tidak peduli di negara bagian apa robot itu berada, '1' dan '2' dapat dibaca; mereka tidak mengubah status mesin. Dalam keadaan awal, '3' atau '4' juga akan diterima; di negara bagian menengah, hanya '4' atau '3' yang diterima; dalam keadaan akhir, baik '3' maupun '4' tidak diterima. Struktur ekspresi reguler paling mudah dipahami jika kita pertama kali mendefinisikan regex untuk subset bahasa kita di mana hanya '3' dan '4' yang muncul:
(34)|(43)
Untuk mengizinkan '1' atau '2' muncul beberapa kali di lokasi tertentu, kita dapat menyisipkan (1|2)*
(atau [12]*
jika bahasa regex kita menerima notasi itu). Memasukkan ekspresi ini di semua lokasi yang tersedia, kita dapatkan
(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*
Menerjemahkan ini ke dalam model konten sangatlah mudah. Struktur dasarnya setara dengan regex (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>
Memasukkan pilihan nol-atau-lebih child1
dan child2
langsung:
<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>
Jika kita ingin meminimalkan sebagian besar, kita dapat menentukan grup bernama untuk pilihan berulang child1
dan 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>
Di XSD 1.1, beberapa batasan pada all
-groups telah dicabut, jadi mungkin saja untuk mendefinisikan model konten ini secara lebih ringkas:
<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>
Tapi seperti yang bisa dilihat dari contoh yang diberikan sebelumnya, perubahan pada all
-group ini sebenarnya tidak mengubah kekuatan ekspresif bahasa; mereka hanya membuat definisi jenis bahasa tertentu lebih ringkas.