Правильное использование xs: альтернатива в XML 1.1

Вот как я определяю элемент с альтернативными типами.

alternative.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  elementFormDefault="qualified"
  vc:minVersion="1.1">

    <xs:complexType name="DefaultType">
        <xs:sequence>
            <xs:element name="string" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="OtherType">
        <xs:sequence>
            <xs:element name="number" type="xs:integer"/>
        </xs:sequence>
    </xs:complexType>

    <xs:element name="root">
        <xs:alternative test="@switchTo = 'OtherType'" type="OtherType"/>
        <xs:alternative type = "DefaultType"/>
    </xs:element>

</xs:schema>

sampleA.xml

<?xml version="1.1" encoding="UTF-8"?>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="alternative.xsd">

    <string>
        Sample
    </string>

</root>

sampleB.xml

<?xml version="1.1" encoding="UTF-8"?>

<root switchTo="OtherType"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="alternative.xsd">

    <number>
        23571113
    </number>

</root>

Сначала ни один из моих валидаторов не поддерживал его, поэтому я перешел на Oxygen XML для оценки. Он проверяет все, и разрешение типов и проверка работают для каждой альтернативы, но я получаю сообщение об ошибке:

Атрибут "switchTo" не может появляться в элементе "apply".

Я знаю, что атрибут не определен для элемента 'root', но я также не знаю, где мне его определять! Я пробовал разные места в поисковой манере, но не повезло. Спасибо за ваше время.

1 ответ

Решение

Если вы устанавливаете различные сложные типы для элемента, тогда ваши сложные типы должны объявить атрибут, который вы хотите дать элементу:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
    elementFormDefault="qualified"
    vc:minVersion="1.1">

    <xs:complexType name="DefaultType">
        <xs:sequence>
            <xs:element name="string" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="switchTo" type="xs:string"/>
    </xs:complexType>

    <xs:complexType name="OtherType">
        <xs:sequence>
            <xs:element name="number" type="xs:integer"/>
        </xs:sequence>
        <xs:attribute name="switchTo" type="xs:string"/>
    </xs:complexType>

    <xs:element name="root">
        <xs:alternative test="@switchTo = 'OtherType'" type="OtherType"/>
        <xs:alternative type = "DefaultType"/>
    </xs:element>

</xs:schema>
Другие вопросы по тегам