Похоже, вам практически нужно определение, которое выглядит примерно так:
<!-- This is an INVALID example -->
<xs:element name="param">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="key" type="xs:string" fixed="age" />
<xs:element name="value" type="xs:decimal" />
</xs:sequence>
<xs:sequence>
<xs:element name="key" type="xs:string" fixed="smart" />
<xs:element name="value" type="xs:boolean" />
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
К сожалению, такой фрагмент кода приводит к неверной схеме XML файла.
Хотя синтаксис правильный, семантика нарушает правила схемы.Элементы с одинаковыми именами и одинаковой областью действия должны иметь одинаковый тип.В этом случае это особенно означает, что все элементы <value>
, являющиеся дочерними элементами элементов <param>
, должны иметь одинаковый тип.
Формально это Ограничение компонента схемы: согласованные объявления элементов .Смотрите также следующее ограничение компонента схемы;как правило, вы не можете сделать тип элемента зависимым от некоторых других значений в документе или какой-либо информации об элементах в оставшейся части последовательности.возможность получить необходимые ограничения, если вы укажете требуемый тип в документе экземпляра вместо того, чтобы определять его исключительно в схеме.Это можно сделать, добавив атрибут xsi:type
к элементам <value>
.
Пример
<param>
<key>age</key>
<value xsi:type="xs:decimal">10</value>
</param>
<param>
<key>smart</key>
<value xsi:type="xs:boolean">true</value>
</param>
Конечно, это немного неудобно, поскольку требует изменения процесса генерации XML.Кроме того, он автоматически не дает никакой гарантии, что <key>
и определенное xsi:type
совпадают.