Это мой первый вопрос о 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>
Или я ничего не скрываю? заранее спасибо