XSD: объединить неизвестное с требуемыми элементами

#xml #xsd

#xml #xsd

Вопрос:

Мне нужно проверить XML с некоторыми обязательными и некоторыми неизвестными элементами.

Проблема в том, что xs:any ожидается, что внутри xs:sequence

Также применяется правило UPA (принадлежит ли неизвестный элемент к xs:any или он принадлежит необязательному элементу minOccurs="0" ?).

XML:

 <person>
    <name>John</name>            <!-- required -->
    <address>Lane 1</address>    <!-- optional -->
    <unknown>someValue</unknown> <!-- unknown  -->
    <status>1</status>           <!-- required -->
</person>
  

Мой лучший снимок (на самом деле: мое пожелание, как это должно работать):

 <xs:complexType name="person">
    <xs:sequence>
        <xs:element name="name" minOccurs="1" maxOccurs="1" />
        <xs:element name="address" minOccurs="0" maxOccurs="1" />
        <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
        <xs:element name="status" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
</xs:complexType>
  

Но согласно всей документации, это не разрешено.

Я также пробовал различные способы вложенности, например:

 <xs:all>
    <xs:sequence>
  

Однако я пока не смог найти решение.

Есть ли у кого-нибудь решение, как объединить требуемые с неизвестными элементами?

Ответ №1:

Ответ на удивление прост: используйте XSD 1.1

Затем фактически будет выполнено следующее.

Обратите внимание на <xs:all> : правильный порядок элементов больше не требуется.

 <xs:complexType name="person">
    <xs:all>
        <!-- Required -->
        <xs:element name="name"/>
        <xs:element name="status"/>
        <!-- Optional -->
        <xs:element name="address" minOccurs="0"/>
        <!-- Unknown-->
        <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
    </xs:all>
</xs:complexType>
  

(Например, в XMLSpy: инструменты -> параметры -> Всегда версия v1.1)