在XSD中使用属性定义元素的正确方法

时间:2015-12-03 09:25:10

标签: xml xsd

我正在尝试创建一个XSD来验证这样的元素:

<productColor Colortype="HEX">353535</productColor>

所以,我坚持自己这很容易,我这样做:

    <xs:element name="productColor" type="xs:string">
        <xs:complexType>
            <xs:attribute name="Colortype" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="HEX"/>
                        <xs:enumeration value="RGB"/>
                        <xs:enumeration value="sRGB"/>
                        <xs:enumeration value="CMYK"/>
                        <xs:enumeration value="HSV"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

但是,但是当我做了一些搜索时,我发现了一些正文(如this link in W3)定义的属性,但是使用扩展名,就像这段代码一样:

<xs:element name="productColor">
<xs:complexType>
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute name="Colortype" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="HEX"/>
                        <xs:enumeration value="RGB"/>
                        <xs:enumeration value="sRGB"/>
                        <xs:enumeration value="CMYK"/>
                        <xs:enumeration value="HSV"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

为什么呢?如果我们阻挡我的方式是错误的(不要使用扩展程序),我发现this link from Microsof它表示你可以不加扩展地执行此操作。 所以现在,我完全糊涂了。

1 个答案:

答案 0 :(得分:0)

数据类型可以是命名的(即全局的)或匿名的(即本地的)。全局定义必须具有名称,并且是直接包含在xs:schema文档元素中的顶级元素。本地类型直接定义在模式中需要它们的位置;它们是匿名的(即没有名称属性);他们有一个地方范围。

在您的情况下,productColor元素有两种类型(错误):

  1. xs:string预定义的简单数据类型。

  2. 本地复杂类型(匿名)。

  3. 通过向简单类型添加属性列表来创建具有简单内容模型的复杂类型。将属性添加到简单类型以创建简单内容复杂类型的操作称为简单类型的扩展。见xs:simpleContent Element