Схема XSD 1.1 для XML с несколькими элементами, имеющими одинаковое имя с типами diff
Как мы можем написать схему XSD для XML ниже, используя XSD 1.1, потому что при использовании XSD 1.0 я сталкиваюсь с некоторой проблемой, так как мы используем одно и то же имя элемента с типами diff (имя атрибута и типы), которое недопустимо и неоднозначно в XSD 1.0, и я думаю в XSD 1.1 может быть какой-то способ (могут быть альтернативы / утверждения), чтобы обойти эту проблему.
<?xml version="1.0" encoding="UTF-8"?>
<SETTINGS>
<CLEANING amount="40"/>
<CLEANING name="abcd"/>
<CLEANING value="0.01"/>
</SETTINGS>
К сожалению, мы не можем изменить формат XML (который содержит несколько элементов с типами атрибутов diff), и нам нужно написать схему XSD для этого XML с ограничениями на значения атрибутов.
Согласно комментариям ниже, созданная схема, как показано ниже, но все еще получает ошибку в проверке вышеупомянутого XML.
<!-- Created with Liquid Studio 2018 (https://www.liquid-technologies.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="SETTINGS" type="settingsType"/>
<xs:element name="CLEANING" type="cleaningType">
<xs:alternative type="amountType" test="exists(@amount)"/>
<xs:alternative type="nameType" test="exists(@name)"/>
<xs:alternative type="valueType" test="exists(@value)"/>
</xs:element>
<xs:complexType name="settingsType">
<xs:sequence>
<xs:element ref="CLEANING" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- Base type -->
<xs:complexType name="cleaningType">
</xs:complexType>
<!-- Type amount -->
<xs:complexType name="amountType">
<xs:complexContent>
<xs:extension base="cleaningType">
<xs:attribute name="amount" type="xs:integer" use="required"/>
<xs:anyAttribute />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- Type name -->
<xs:complexType name="nameType">
<xs:complexContent>
<xs:extension base="cleaningType">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:anyAttribute />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- Type value -->
<xs:complexType name="valueType">
<xs:complexContent>
<xs:extension base="cleaningType">
<xs:attribute name="value" type="xs:float" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Ошибка Серьезность Расположение Имя файла Сообщение
7:66 schema.xsd s4s-elt-must-match.1: содержимое 'CLEANING' должно совпадать (аннотация?, (simpleType | complexType)?, (уникальная | key | keyref)*)). Проблема была найдена, начиная с: альтернатива.
4:24 sample.xml cvc-complex-type.3.2.2: атрибут 'name' не может появляться в элементе 'CLEANING'.