различая xs: выборы в xsd, используя фиксированные значения для элемента с типом перечисления - PullRequest
0 голосов
/ 09 марта 2011

Можно ли различить xs: выборы в xsd, используя фиксированные значения?У меня есть простой тип:

<xs:simpleType name="datatypeCategory">
    <xs:restriction base="xs:string">
        <xs:enumeration value="SIMPLE"/>
        <xs:enumeration value="COMPLEX"/>
        <xs:enumeration value="COLLECTION"/>
    </xs:restriction>
</xs:simpleType>

И что я хочу достичь, это

<xs:element name="datatype">
    <xs:complexType>
        <xs:choice>
            <xs:sequence>
                <xs:element id="category" type="datatypeCategory" fixed="SIMPLE"/>
                <!-- some fields specific for SIMPLE -->
            </xs:sequence>
            <xs:sequence>
                <xs:element id="category" type="datatypeCategory" fixed="COMPLEX"/>
                <!-- some fields specific for COMPLEX -->
            </xs:sequence>
            <xs:sequence>
                <xs:element id="category" type="datatypeCategory" fixed="COLLECTION"/>
                <!-- some fields specific for COLLECTION -->
            </xs:sequence>
        </xs:choice>
    </xs:complexType>
</xs:element>

Когда я делаю это, мой XMLSpy говорит мне:

# The content model of complex type definition '{anonymous}' is ambiguous.
# Details: cos-nonambig: <xs:element name='category'> makes the content model non-deterministic against <xs:element name='category'>. Possible causes: name equality, overlapping occurrence or substitution groups.

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Вы не можете сделать это точно. Ошибка в том, что простой валидатор, который видит элемент <category>, не сразу узнает, какую ветку выбрать, и XML Schema 1.0 поддерживает такие простые валидаторы.

В качестве альтернативы можно назвать каждый элемент в соответствии с категорией.

<xs:element name="datatype">
    <xs:complexType>
        <xs:choice>
            <xs:sequence>
                <xs:element name="simpleCategory" type="empty"/>
                <!-- some fields specific for SIMPLE -->
            </xs:sequence>
            <xs:sequence>
                <xs:element name="complexCategory" type="empty"/>
                <!-- some fields specific for COMPLEX -->
            </xs:sequence>
            <xs:sequence>
                <xs:element name="collectionCategory" type="empty"/>
                <!-- some fields specific for COLLECTION -->
            </xs:sequence>
        </xs:choice>
    </xs:complexType>
</xs:element>

где empty определяется как пустой тип. Или дайте им сложные типы для хранения «определенных полей». Существуют и другие альтернативы в зависимости от ваших ограничений, например, использование групп подстановки или производных сложных типов.

В целом, XML Schema 1.0 не подходит для ограничений, основанных на взаимосвязанных значениях. Для этого вам нужно перейти к XML-схеме 1.1 или внешнему инструменту.

0 голосов
/ 09 марта 2011

идентификаторы должны быть уникальными в документе.Вы не можете использовать одно и то же значение для нескольких элементов:

http://www.w3.org/TR/2006/REC-xml11-20060816/#id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...