XSD: как ограничить значения перечисления производного сложного типа? - PullRequest
6 голосов
/ 15 февраля 2010

Учитывая следующий пример:

<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 "Lyric" как "Мягкая обложка".

«None», «Liporello» и «Hardcover» больше не должны быть допустимыми значениями для «Lyric». это можно сделать в xsd?

Ответы [ 2 ]

9 голосов
/ 15 февраля 2010

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

Возможно, вместо этого рассмотрите возможность работы снизу вверх: определите базовый тип книги, в котором почти ничего нет; затем определите LyricType, который является объединением базового типа и еще нескольких значений; нести bookCode в подтипах. Это не идеально, но, увы, XSD не всегда совпадает с объектно-ориентированными языками.

1 голос
/ 15 февраля 2010

В конечном итоге ... вы пытаетесь проверить узел, используя значение другого (родительский или родной или другой, и т. Д.) .. Что, конечно, невозможно ..

...