Przykro mi, że trudziłeś się z tym problemem przez 7 lat bez odpowiedzi.
Zamierzam pomóc, ponownie analizując twoje założenia.
Traktując "Imię" jako część danych, która musi nadejść jako pierwsza i wymagając, aby była ona dzieckiem Aplikacji, a następnie mówiąc ogólnie, że nie obchodzi Cię kolejność rodzeństwa, tworząc dla siebie dezorientującą sytuację. Dlaczego imię jest rodzajem ADD i DELETE, jeśli przestrzega różnych zasad i służy innym celom? Gdybyś musiał modelować to w dowolnej innej strukturze danych, nie umieszczałbyś "Nazwa" na liście rzeczy obok "ADD" i "DELETE". Powiedziałbyś dwie rzeczy: Aplikacja ma Nazwę, a także listę poleceń, takich jak DODAJ i USUŃ.
Ponieważ Nazwa jest czymś specjalnym w porównaniu z ADD i DELETE, powinna być modelowana oddzielnie od innych tagów.
Można więc ustawić nazwę jako atrybut aplikacji i zachować jako elementy podrzędne Dodaj i usuń, lub zachować nazwę jako element podrzędny, ale następnie otaczać ADD i DELETE za pomocą znacznika zastępczego/grupy, takiego jak polecenia . Tag Commands byłby jedynym rodzeństwem Name.
Oto schemat obsługujący nazwę jako atrybut z dowolną liczbą poleceń w dowolnej kolejności. "Nazwa jako 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>
Przykład 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>
A oto jeden z tych poleceń zagnieżdżonych wewnątrz znacznika zastępczego. "Polecenia 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>
Przykład 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>
Jedna uwaga na temat jednego z nich jest to, że wiadomości z zerowymi polecenia są wciąż aktualne przesłanie. Być może jest to w porządku, ale jeśli jest to problem, być może ta walidacja należy do warstwy aplikacji, a nie do XSD.
Bardzo dziękuję za odpowiedź. Dokładnie podniosłem moje pytanie powyżej. Miałem na myśli, że ADD i DELETE nie powinny pojawić się 0 lub 1 razy, ale ich kolejność nie ma znaczenia. "all" nie może być użyty w tym przypadku, ponieważ element obowiązkowy NAME nie może być oznaczony jako "all". Czy masz jakieś inne rozwiązanie? Dziękujemy – ogee
Działa tylko z atrybutem maxOccurs = "nieograniczony" dla znacznika wyboru – Pooya