在XSD中定义一个元素,它是一个ENUM并具有一个属性

时间:2015-11-18 14:13:55

标签: java xml enums xsd

我想为以下xml提供XSD:

<root>
    <tag>
        <child1>value1_1</child1>
        <child2 att="att1">value2_1</child2>
    </tag>
</root>

使用以下XSD

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root" type="rootMeta"/>
    <xs:element name="tag" type="tagMeta"/>

    <xs:complexType name="rootMeta">
        <xs:sequence>
            <xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="tagMeta">
        <xs:sequence>
            <xs:element name="child1" type="enum1"/>
            <xs:element name="child2" type="enum2"/>
        </xs:sequence>
    </xs:complexType>`

    <xs:simpleType name="enum1">
        <xs:restriction base="xs:string">
            <xs:enumeration value="value1_1"/>
            <xs:enumeration value="value1_2"/>
        </xs:restriction>
    </xs:simpleType>

    <!-- And here the problem comes -->

    <xs:complexType name="enum2">
        <xs:simpleContent>
            <xs:restriction base="xs:string">
              <xs:enumeration value="value2_1"/>
              <xs:enumeration value="value2_2"/>
            </xs:restriction>
        </xs:simpleContent>
        <xs:attribute name="att" type="attMeta" use="required"/>
    </xs:complexType>

    <xs:simpleType name="attMeta">
        <xs:restriction base="xs:string">
            <xs:enumeration value="att1"/>
            <xs:enumeration value="att2"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

定义错误且验证无法完成,任何人都可以解释我如何定义 enum2 以将枚举作为值和属性?

1 个答案:

答案 0 :(得分:0)

实现想要的一种方法可能是定义一个simpleType,然后可以扩展它以添加属性:

<xs:complexType name="enum2">
    <xs:simpleContent>
        <xs:extension base="enum2_text_values">
            <xs:attribute name="att" type="attMeta" use="required"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

它依赖于已提到的 enum2_text_values simpleType,您可以定义如下:

<xs:simpleType name="enum2_text_values">
    <xs:restriction base="xs:string">
        <xs:enumeration value="value2_1"/>
        <xs:enumeration value="value2_2"/>
    </xs:restriction>
</xs:simpleType>