Вам требуется элемент выбора в вашей схеме.Это позволит вам выразить, что может появиться только один из набора элементов.
РЕДАКТИРОВАТЬ: вам нужно указать имя для элемента, либо напрямую через name
, либо со ссылкой на элементопределено в другом месте с помощью ref
.
Насколько мне известно, ваша единственная альтернатива - иметь что-то вроде этого:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="PetCage">
<xs:complexType>
<xs:sequence>
<xs:element name="animal" type="Animal" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Animal" abstract="true">
<xs:attribute name="Name" type="xs:string" />
</xs:complexType>
<xs:complexType name="Cat">
<xs:complexContent>
<xs:extension base="Animal"></xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Это будет проверять XML-файлыФорма выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<PetCage>
<animal xsi:type="Cat" Name="String"/>
</PetCage>
К сожалению, это делает вас привязанными к этому animal
имени элемента.Я сомневаюсь, что XML-схема позволяет вам указать определенный тип и позволяет использовать подстановочный знак для имени.XML-схема проверяет на основе имен элементов и, если элемент определен с абстрактным типом, атрибут xsi:type
.Существует объявление xs:any
, но его нельзя привязать к какому-либо конкретному типу.Следующее будет проверять как можно лучше, но все же позволяет использовать любой элемент, определенный в корне схемы:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="PetCage">
<xs:complexType>
<xs:sequence>
<xs:any processContents="strict" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="Animal" abstract="true">
<xs:attribute name="Name" type="xs:string" />
</xs:complexType>
<xs:element name="cat" />
<xs:complexType name="Cat">
<xs:complexContent>
<xs:extension base="Animal"></xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Это подтвердит это правильно:
<?xml version="1.0" encoding="UTF-8"?>
<PetCage>
<cat Name="snookums"/>
</PetCage>
...но это не помешает вам поместить PetCage в PetCage.
Я надеюсь, что кто-то с хорошим знанием спецификации XML-схемы сможет подтвердить, что это правильно, или, предпочтительно, предложить желаемое решение.