Tôi rất tiếc vì bạn đã gặp vấn đề này trong 7 năm mà không có câu trả lời.
Tôi sẽ trợ giúp bằng cách xem xét lại các giả định của bạn.
Bằng cách xử lý "Tên" như một phần dữ liệu phải đến trước và yêu cầu phải là con của Ứng dụng, và sau đó nói chung bạn không quan tâm đến thứ tự của anh chị em của nó, bạn tạo ra một tình huống khó hiểu cho chính mình. Tại sao Đặt tên cho anh chị em của ADD và DELETE nếu nó tuân theo các quy tắc khác nhau và phục vụ một mục đích khác? Nếu bạn phải mô hình hóa cấu trúc này trong bất kỳ cấu trúc dữ liệu nào khác, bạn sẽ không bao gồm "Tên" trong danh sách những thứ cùng với "ADD" và "DELETE". Bạn sẽ nói hai điều: Một ứng dụng có một tên, và nó cũng có một danh sách các lệnh như ADD và DELETE.
Vì Tên là một điều đặc biệt so với ADD và DELETE, nên nó được mô hình riêng biệt với các thẻ khác. Vì vậy, bạn có thể đặt Tên là thuộc tính của Ứng dụng và giữ Thêm và Xóa làm phần tử con hoặc bạn có thể giữ Tên làm phần tử con nhưng sau đó bao quanh THÊM VÀ XÓA bằng thẻ trình giữ chỗ/nhóm, chẳng hạn như Lệnh . Thẻ Lệnh sẽ là anh chị em duy nhất của Tên.
Đây là lược đồ hỗ trợ Tên dưới dạng thuộc tính, với số lượng lệnh tùy ý theo thứ tự bất kỳ. "Tên như Attribute.xsd":
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Application" type="Application_Type" />
<xs:complexType name="Application_Type">
<xs:all>
<xs:element minOccurs="0" ref="ADD"/>
<xs:element minOccurs="0" ref="DELETE"/>
<xs:element minOccurs="0" ref="THIRD"/>
<xs:element minOccurs="0" ref="FOURTH"/>
</xs:all>
<xs:attribute name="Name"/>
</xs:complexType>
<xs:element name="ADD"/>
<xs:element name="DELETE"/>
<xs:element name="THIRD"/>
<xs:element name="FOURTH"/>
</xs:schema>
Ví dụ XML:
<?xml version="1.0" encoding="UTF-8"?>
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="text" xsi:noNamespaceSchemaLocation="Name as Attribute.xsd">
<THIRD>text</THIRD>
<ADD>text</ADD>
<FOURTH>text</FOURTH>
<DELETE>text</DELETE>
</Application>
Và đây là một với các lệnh lồng nhau trong một thẻ giữ chỗ. "Lệnh Grouping.xsd":
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Application" type="Application_Type"/>
<xs:complexType name="Application_Type">
<xs:sequence>
<xs:element ref="Name"/>
<xs:element name="Commands" type="Commands_Type"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Commands_Type">
<xs:all>
<xs:element minOccurs="0" ref="ADD"/>
<xs:element minOccurs="0" ref="DELETE"/>
<xs:element minOccurs="0" ref="THIRD"/>
<xs:element minOccurs="0" ref="FOURTH"/>
</xs:all>
</xs:complexType>
<xs:element name="Name"/>
<xs:element name="ADD"/>
<xs:element name="DELETE"/>
<xs:element name="THIRD"/>
<xs:element name="FOURTH"/>
</xs:schema>
Ví dụ XML:
<?xml version="1.0" encoding="UTF-8"?>
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Commands Grouping.xsd">
<Name>text</Name>
<Commands>
<THIRD>text</THIRD>
<ADD>text</ADD>
<FOURTH>text</FOURTH>
<DELETE>text</DELETE>
</Commands>
</Application>
Một lưu ý về hai trong số này là những thông điệp với zero lệnh vẫn còn nhắn hợp lệ. Có lẽ không sao, nhưng nếu đó là một vấn đề, có lẽ việc xác thực đó thuộc về lớp Ứng dụng chứ không phải là XSD.
Cảm ơn rất nhiều câu trả lời của bạn. Tôi đã kiểm tra câu hỏi của tôi ở trên. Tôi có nghĩa là ADD và DELETE sẽ không xuất hiện 0 hoặc 1 lần, nhưng thứ tự của chúng không quan trọng. Không thể sử dụng "tất cả" trường hợp này, vì phần tử bắt buộc NAME không thể đi kèm với "tất cả". Bạn có giải pháp nào khác không? Cảm ơn – ogee
Chỉ hoạt động với thuộc tính maxOccurs = "không bị chặn" cho thẻ lựa chọn – Pooya