XSD: должен быть объявлен один и только один элемент определенного типа - PullRequest
1 голос
/ 04 ноября 2011

Допустим, у меня есть элемент PetCage, который должен содержать один и только один тип AnimalElement, например:

<PetCage>
    <Cat Name="Kitty">
</PetCage>

<PetCage>
    <Dog Name="Buddy">
</PetCage>

Оба типа Cat и Dog имеют тип AnimanlElement.Как я могу выразить указанное правило в XSD?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011
<xs:complexType name="PetCage">
    <xs:choice>
         <xs:element name="Cat" type="AnimanlElement" />
         <xs:element name="Dog" type="AnimanlElement" />
    </xs:choice>
</xs:complexType>
<!-- AnimanlElement definition -->
<xs:complexType name="AnimanlElement">
    <xs:attribute name="Name" type="xs:string" />
</xs:complexType>

Для более: http://www.w3schools.com/Schema/el_choice.asp

2 голосов
/ 04 ноября 2011

Вам требуется элемент выбора в вашей схеме.Это позволит вам выразить, что может появиться только один из набора элементов.

РЕДАКТИРОВАТЬ: вам нужно указать имя для элемента, либо напрямую через 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-схемы сможет подтвердить, что это правильно, или, предпочтительно, предложить желаемое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...