Công thức thay thế của câu hỏi được thêm vào trong bản chỉnh sửa sau này dường như vẫn chưa được trả lời: làm thế nào để chỉ định rằng trong số các phần tử con, phải có một phần tử được đặt tên child3
, một phần tử được đặt tên child4
và bất kỳ số nào có tên child1
hoặc child2
, không có ràng buộc về thứ tự trong mà những đứa trẻ xuất hiện.
Đây là một ngôn ngữ thông thường có thể xác định một cách dễ dàng và mô hình nội dung bạn cần là đồng cấu với một biểu thức chính quy xác định tập hợp các chuỗi trong đó các chữ số '3' và '4' mỗi xuất hiện đúng một lần và các chữ số '1' và '2 'xảy ra bất kỳ số lần nào. Nếu không rõ ràng về cách viết điều này, có thể hữu ích khi nghĩ về loại máy trạng thái hữu hạn mà bạn sẽ xây dựng để nhận ra một ngôn ngữ như vậy. Nó sẽ có ít nhất bốn trạng thái riêng biệt:
- trạng thái ban đầu mà cả '3' và '4' đều không được nhìn thấy
- trạng thái trung gian trong đó '3' đã được nhìn thấy nhưng không phải '4'
- một trạng thái trung gian trong đó '4' đã được nhìn thấy nhưng không phải là '3'
- trạng thái cuối cùng trong đó cả '3' và '4' đã được nhìn thấy
Cho dù ô tự động ở trạng thái nào, '1' và '2' có thể được đọc; chúng không thay đổi trạng thái của máy. Ở trạng thái ban đầu, "3" hoặc "4" cũng sẽ được chấp nhận; ở các trạng thái trung gian, chỉ chấp nhận '4' hoặc '3'; ở trạng thái cuối cùng, cả '3' và '4' đều không được chấp nhận. Cấu trúc của biểu thức chính quy dễ hiểu nhất nếu trước tiên chúng ta xác định một regex cho tập hợp con của ngôn ngữ của chúng ta, trong đó chỉ có '3' và '4' xảy ra:
(34)|(43)
Để cho phép '1' hoặc '2' xuất hiện bất kỳ số lần nào tại một vị trí nhất định, chúng tôi có thể chèn (1|2)*
(hoặc [12]*
nếu ngôn ngữ regex của chúng tôi chấp nhận ký hiệu đó). Chèn biểu thức này ở tất cả các vị trí có sẵn, chúng tôi nhận được
(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*
Chuyển nó thành một mô hình nội dung rất đơn giản. Cấu trúc cơ bản tương đương với 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>
Chèn một lựa chọn không hoặc nhiều hơn child1
và child2
rất đơn giản:
<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>
Nếu chúng ta muốn giảm thiểu khối lượng lớn một chút, chúng ta có thể xác định một nhóm được đặt tên cho các lựa chọn lặp lại child1
và 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>
Trong XSD 1.1, một số ràng buộc về all
nhóm đã được dỡ bỏ, vì vậy có thể xác định mô hình nội dung này một cách ngắn gọn hơn:
<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>
Nhưng như có thể thấy từ các ví dụ được đưa ra trước đó, những thay đổi này đối với- all
nhóm trên thực tế không làm thay đổi sức mạnh biểu đạt của ngôn ngữ; chúng chỉ làm cho định nghĩa của một số loại ngôn ngữ ngắn gọn hơn.