指定枚举作为内容,并在xsd中具有单一类型的属性?

时间:2015-07-15 19:18:10

标签: xml xsd

有没有办法在xml架构中的单个类型中定义以下内容?

<Foo bar="1">ENUM</Foo>

它必须是simpleType,因为字符串可以是restriction,但它不能有attribute

<element name="Foo">
    <simpleType>
        <restriction base="string">
            <!-- some enums... -->
        </restriction>
    </simpleType>
</element>

如果我为该属性设置simpleType extension,则无法指定枚举。

<element name="Foo">
    <simpleType>
        <extension base="string">
            <attribute name="bar" type="positiveInteger" />
        </extension>
    </simpleType>
</element>

我尝试了simpleContentcomplexContent,但您无法添加属性。另外我认为基类型必须复杂。

有没有办法在单个element元素中执行此操作而不添加其他类型?

下面是一种使用其他类型的方法。

<element name="Foo">
    <complexType>
        <simpleContent>
            <extension base="this:FooEnum">
                <attribute name="bar" type="positiveInteger" />
            </extension>
        </simpleContent>
    </complexType>
</element>

<simpleType name="FooEnum">
    <restriction base="string">
        <!-- some enums... -->
    </restriction>
</simpleType>

1 个答案:

答案 0 :(得分:2)

XSD 1.0解决方案

在XSD 1.0中,你可以通过限制xs:anyType

来做类似的事情
<xs:element name="foo">
    <xs:complexType>
        <xs:simpleContent>
            <xs:restriction base="xs:anyType">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="value1"/>
                        <xs:enumeration value="value2"/>
                    </xs:restriction>
                </xs:simpleType>
                <xs:attribute name="bar" type="xs:positiveInteger"/>
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

请注意,如果需要,可以将xs:enumeration节点作为xs:attribute节点的兄弟节点移动,但不能删除xs:simpleType节点:

<xs:element name="foo">
    <xs:complexType>
        <xs:simpleContent>
            <xs:restriction base="xs:anyType">
                <xs:simpleType>
                    <xs:restriction base="xs:string"/>                        
                </xs:simpleType>
                <xs:enumeration value="value1"/>
                <xs:enumeration value="value2"/>
                <xs:attribute name="bar" type="xs:positiveInteger"/>
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

XSD 1.1解决方案

使用XSD 1.1,您可以使用mixed=true并将枚举表达为complexType的断言,尽管这不像XSD枚举那样富有表现力。基本示例:

<xs:element name="foo">
    <xs:complexType mixed="true">
        <xs:attribute name="bar" type="xs:positiveInteger"/>
        <xs:assert test=". = ('value1', 'value2')"/> <!-- Value in enum -->            
    </xs:complexType>
</xs:element>