【问题标题】:XSD Complex EnumerationXSD 复杂枚举
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 您好,感谢您的回答。我不知道断言,它们看起来可能会解决这个问题。我稍微扩展了这个问题,试图说明我试图避免重复的部分。
    猜你喜欢
    • 2011-01-16
    • 2023-04-04
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多