Правильное использование 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>