Xml XSD复杂枚举

Xml XSD复杂枚举,xml,xsd,enumeration,complextype,Xml,Xsd,Enumeration,Complextype,这是我关于stackoverflow的第一个问题(我通常能够用这里已经给出的答案来解决我的问题) 这与这些问题类似,但我认为我的问题有点不同(而且,XSD真的很难): 我试图定义一组表示参数数据类型的受限“类型”。例如 - Binary bit-mapped B/BM 1 byte - Unsigned Integer U/I 2 bytes - Alphanumeric ALPHA 1 byte - etc

这是我关于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...
注意:我还尝试了一个序列,并且“type,缩写,length”是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>

123
某些状态类型的消息
二进制位映射
B/BM
1.
等
321
不同的状态类型消息
二进制位映射
B/BM
1.
等
456
连续值类型消息
无符号整数
U/I
2.
等
有没有一种方法可以避免必须在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>

123
某些状态类型的消息
等
321
不同的状态类型消息
等

还是我在无中生有?提前感谢

XSD 1.0中的一般规则是不能定义共同约束:即,一个元素的有效值完全独立于任何其他元素的有效值


在XSD 1.1中,您可以使用断言做您喜欢做的事情。

您好,谢谢您的回答。我不知道断言,它们看起来可以解决一些问题。我把问题扩展了一点,试图说明我试图避免重复的部分。