【发布时间】:2012-02-01 01:25:55
【问题描述】:
这是我在 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:attributes,所以如果这是一个更好的解决方案,请告诉我。
这工作正常,但它需要 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>
或者我是在隐瞒什么?提前致谢
【问题讨论】:
标签: xml xsd enumeration complextype