Мне жаль, что вы уже 7 лет трудитесь над этой проблемой, но без ответа.
Я собираюсь помочь, пересмотрев ваши предположения.
Обрабатывая «Имя» как часть данных, которая должна идти первой, и требуя, чтобы она была дочерней по отношению к Приложению, а затем в общем говоря, что вы не заботитесь о порядке своих братьев и сестер, вы делаете запутанная ситуация для себя. Почему Name является родным братом ADD и DELETE, если он следует другим правилам и служит другой цели? Если бы вам пришлось смоделировать это в любой другой структуре данных, вы бы не включили «Имя» в список вещей наряду с «ДОБАВИТЬ» и «УДАЛИТЬ». Вы бы сказали две вещи: у приложения есть имя, а также список команд, таких как ADD и DELETE.
Поскольку имя - это особенная вещь по сравнению с ДОБАВИТЬ и УДАЛИТЬ, то его следует моделировать отдельно от других тегов.
Таким образом, вы можете либо сделать Name атрибутом Application, и оставить Add и Delete в качестве дочерних элементов, либо вы можете оставить Name в качестве дочернего элемента, но затем окружить ADD и DELETE тегом-заполнителем / группировкой, например Commands. Тег Commands будет единственным братом Name.
Вот схема, поддерживающая Name в качестве атрибута с произвольным количеством команд в любом порядке. «Имя как атрибут.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>
Пример 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>
И вот одна из них с командами, вложенными в тег-заполнитель. "Commands 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>
Пример 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>
Одно замечание по поводу любого из них заключается в том, что сообщения с нулевыми командами по-прежнему являются действительными сообщениями. Возможно, это нормально, но если это проблема, возможно, проверка относится к прикладному уровню, а не к XSD.