การกำหนดทางเลือกของคำถามที่เพิ่มในการแก้ไขในภายหลังดูเหมือนจะยังไม่ได้รับคำตอบ: วิธีระบุว่าในกลุ่มย่อยขององค์ประกอบจะต้องมีชื่อchild3
หนึ่งชื่อchild4
และหมายเลขใด ๆ ที่มีชื่อchild1
หรือchild2
โดยไม่มีข้อ จำกัด ในลำดับใน ซึ่งเด็ก ๆ ปรากฏตัว
นี่เป็นภาษาปกติที่กำหนดได้อย่างตรงไปตรงมาและรูปแบบเนื้อหาที่คุณต้องการคือ isomorphic สำหรับนิพจน์ทั่วไปที่กำหนดชุดของสตริงซึ่งแต่ละหลัก '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]*
ถ้าภาษา regex ของเรายอมรับสัญกรณ์นั้น) เราได้รับการแทรกนิพจน์นี้ในตำแหน่งที่มีอยู่ทั้งหมด
(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
-groups เหล่านี้ไม่ได้เปลี่ยนพลังในการแสดงออกของภาษา ทำให้คำจำกัดความของภาษาบางประเภทมีความกระชับมากขึ้นเท่านั้น