Комплексное перечисление XSD

Это мой первый вопрос о stackoverflow (обычно мне удавалось выяснить свои проблемы с ответами, уже представленными здесь).

Это похоже на эти вопросы, но я думаю, что мой вопрос немного отличается (к тому же, XSD действительно сложен):

Я пытаюсь определить ограниченный набор «типов», которые представляют типы данных параметров. Например.

    - Binary bit-mapped    B/BM    1 byte
    - Unsigned Integer     U/I     2 bytes
    - Alphanumeric         ALPHA   1 byte
    - etc...

Итак, я придумал следующий xsd:

<xs:complexType name="parameterDataType" abstract="true">
    <xs:sequence>
        <xs:element name="type" type="xs:string" />
        <xs:element name="abbreviation" type="xs:string" />
        <xs:element name="length" type="xs:positiveInteger" />
    </xs:sequence>
</xs:complexType>

<xs:complexType name="binaryBitMappedType">
    <xs:complexContent>
        <xs:restriction base="parameterDataType">
            <xs:sequence>
                <xs:element name="type" type="xs:string" fixed="Binary Bit-Mapped" />
                <xs:element name="abbreviation" type="xs:string" fixed="B/BM" />
                <xs:element name="length" type="xs:positiveInteger" fixed="1" />
            </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>
etc...

ПРИМЕЧАНИЕ ХОРОШО: я также пробовал это с последовательностью и «типом, аббревиатурой, длиной», являющейся xs: атрибутами, поэтому, если это лучшее решение, дайте мне знать.

Это работает нормально, но требует, чтобы XML переопределял элемент как их ограниченные значения (в противном случае это недействительно), примерно так:

<message>
    <id>123</id>
    <name>Some status type message</name>
    <dataType xsi:type="binaryBitMappedType">
        <type>Binary Bit-Mapped</type>
        <abbreviation>B/BM</abbreviation>
        <length>1</length>
    </dataType>
    ...etc
</message>
<message>
    <id>321</id>
    <name>A DIFFERENT status type message</name>
    <dataType xsi:type="binaryBitMappedType">
        <type>Binary Bit-Mapped</type>
        <abbreviation>B/BM</abbreviation>
        <length>1</length>
    </dataType>
    ...etc
</message>
<message>
    <id>456</id>
    <name>a continuous value type message</name>
    <dataType xsi:type="unsignedIntegerType">
        <type>Unsigned Integer</type>
        <abbreviation>U/I</abbreviation>
        <length>2</length>
    </dataType>
    ...etc
</message>

Есть ли способ избежать необходимости переопределять эти значения в XML (можно ли определение получить из XSD или предположить из XSD?) В качестве альтернативы, могут ли определения быть предоставлены в их собственном файле XML, а затем «импортированы». " на основе xsi:type?

Что-то вроде этого?

<message>
    <id>123</id>
    <name>Some status type message</name>
    <dataType xsi:type="binaryBitMappedType" /> <!-- don't have to repeat the dataType contents -->
    ...etc
</message>
<message>
    <id>321</id>
    <name>A DIFFERENT status type message</name>
    <dataType xsi:type="binaryBitMappedType" /> <!-- don't have to repeat the dataType contents -->
    ...etc
</message>

Или я ничего не скрываю? заранее спасибо


person Doddie    schedule 01.02.2012    source источник


Ответы (1)


Общее правило в XSD 1.0 заключается в том, что вы не можете определять совместные ограничения: то есть допустимые значения одного элемента полностью независимы от допустимых значений любого другого элемента.

В XSD 1.1 вы можете делать что хотите, используя утверждения.

person Michael Kay    schedule 01.02.2012
comment
Привет, спасибо за ответ. Я не знал об утверждениях, и похоже, что они могут решить часть этой проблемы. Я немного расширил вопрос, чтобы попытаться проиллюстрировать части, которые я пытаюсь избежать повторения. - person Doddie; 02.02.2012