是否可以定义XSD复杂类型以根据枚举属性的值验证属性使用?

时间:2013-12-18 09:55:45

标签: xml xsd

以下XSD定义了一个复杂类型,它可以具有class =“BIT”和大小,OR class =“CHAR”和编码。此类型将用于的元素将不包含任何内容。

<xs:complexType>
    <xs:attribute name="class">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="CHAR"/>
                <xs:enumeration value="BIT"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="size" type="xs:integer" />
    <xs:attribute name="encoding" type="xs:string" />
</xs:complexType>

有没有办法可以更改这个复杂的类型定义,如果类是BIT则需要大小,如果类是CHAR,则需要编码?

size或encoding属性的存在应该是互斥的,具有BIT的编码或具有CHAR的大小在其使用的上下文中将是无意义的。

1 个答案:

答案 0 :(得分:0)

如果允许更改模式,则以下内容应该有效,但在此模式的XML实例中,基本类型的元素将需要显式的xsi:type属性。它的工作方式是使用class属性创建的基类型,扩展为包含大小和编码属性,然后进行限制。元素可以在模式中声明为基类型,实例可以使用受限类型。

<!-- Base Read Mode Simple Type -->

<xs:simpleType name="MyReadModeType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="CHAR"/>
        <xs:enumeration value="BIT"/>
    </xs:restriction>
</xs:simpleType>

<!-- Char Read Mode Simple Type -->

<xs:simpleType name="MyCharReadModeType">
    <xs:restriction base="tns:MyReadModeType">
        <xs:enumeration value="CHAR"/>
    </xs:restriction>
</xs:simpleType>

<!-- Bit Read Mode Simple Type -->

<xs:simpleType name="MyBitReadModeType">
    <xs:restriction base="tns:MyReadModeType">
        <xs:enumeration value="BIT"/>
    </xs:restriction>
</xs:simpleType>

<!-- Set Read Mode Base Type -->

<xs:complexType name="MySetReadModeType" abstract="true">
    <xs:attribute name="class" type="tns:MyReadModeType" />
</xs:complexType>

<!-- Set Char Mode Extension -->

<xs:complexType name="MyBaseSetCharReadModeType" abstract="true">
    <xs:complexContent>
        <xs:extension base="tns:MySetReadModeType">
            <xs:attribute name="size" type="tns:MyReadModeSizeType" use="prohibited" />
            <xs:attribute name="encoding" type="xs:string" use="required"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<!-- Set Char Mode Type -->

<xs:complexType name="charMode">
    <xs:complexContent>
        <xs:restriction base="tns:MyBaseSetCharReadModeType">
            <xs:attribute name="size" type="tns:MyReadModeSizeType" use="prohibited" />
            <xs:attribute name="encoding" type="xs:string" use="required"/>
            <xs:attribute name="class" type="tns:MyCharReadModeType" use="optional" default="CHAR" />
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

<!-- Set Bit Mode Extension -->

<xs:complexType name="MyBaseSetBitReadModeType" abstract="true">
    <xs:complexContent>
        <xs:extension base="tns:MySetReadModeType">
            <xs:attribute name="size" type="tns:MyReadModeSizeType" use="required" />
            <xs:attribute name="encoding" type="xs:string" use="prohibited"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<!-- Set Bit Mode Type -->

<xs:complexType name="bitMode">
    <xs:complexContent>
        <xs:restriction base="tns:MyBaseSetBitReadModeType">
            <xs:attribute name="size" type="tns:MyReadModeSizeType" use="required" />
            <xs:attribute name="encoding" type="xs:string" use="prohibited"/>
            <xs:attribute name="class" type="tns:MyBitReadModeType" use="optional" default="BIT"/>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>