有没有办法在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>
我尝试了simpleContent
或complexContent
,但您无法添加属性。另外我认为基类型必须复杂。
有没有办法在单个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>
答案 0 :(得分:2)
在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,您可以使用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>