以下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的大小在其使用的上下文中将是无意义的。
答案 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>