Учитывая следующий пример:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Book" abstract="true">
<xs:sequence>
<xs:element name="titel" type="xs:string">
</xs:element>
<xs:element name="bookCode" type="BookEnum"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Lyric">
<xs:complexContent>
<xs:extension base="Book">
<xs:sequence>
<xs:element name="author" type="xs:string">
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:simpleType name="BookEnum">
<xs:restriction base="xs:int">
<xs:enumeration value="Paperback"/>
<xs:enumeration value="Hardcover"/>
<xs:enumeration value="Liporello"/>
<xs:enumeration value="None"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Лиричный происходит из Книги. Я хотел бы ограничить возможные значения BookEnum для complexType "Лирического", чтобы быть "Paperback".
"Ни один", "Liporello" и "Книга в твердом переплете" больше не должны быть допустимыми значениями для "Лирического". это может быть сделано в xsd?
Нет, к сожалению, вы не можете этого сделать. Невозможно ограничить подобное перечисление, и у вас также возникнут проблемы с одновременным расширением и ограничением сложного типа. Есть хорошая статья о том, что вы можете делать с перечислениями здесь .
Возможно, вместо этого рассмотрите возможность работы снизу вверх: определите базовый тип книги, в котором почти ничего нет; затем определите LyricType, который представляет собой объединение базового типа и некоторых других значений; несите bookCode в подтипах. Это не идеально, но, увы, XSD не всегда соответствует объектно-ориентированным языкам.
В конечном итоге ... вы пытаетесь проверить узел, используя значение другого (родительский, родственный и т. Д.) .. Что, конечно, невозможно ..