XSD"一个或两个"选择不适用于类型限制

时间:2015-05-19 10:49:31

标签: xml xsd

我想创建一个XSD,其中Item需要指定至少一个标识符,或两者都指定,但从不指定任何标识符。 这在第一时间工作正常:

<xs:choice>
<xs:sequence>
    <xs:element name="OneIdType">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:maxLength value="50"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="AnotherIdType" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:element name="AnotherIdType" type="xs:string"/>

但两种IdType都应具有(不同的)长度限制。 因此,当我尝试以下操作时,我的XSD无效:

<xs:choice>
<xs:sequence>
    <xs:element name="OneIdType">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:maxLength value="50"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="AnotherIdType" minOccurs="0">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:maxLength value="20"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:sequence>
<xs:element name="AnotherIdType">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:maxLength value="20"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

我收到错误

  

元素&#39; AnotherIdType&#39;与元素不一致&#39; AnotherIdType&#39;

因此XSD有可能实施一个或两个选择&#34;限制类型?

谢谢, 最大

1 个答案:

答案 0 :(得分:1)

虽然这两个AnotherIdType元素声明中的匿名类型具有相同的定义,但它们不是相同的类型。将simpleType声明拉出到顶层

<xs:simpleType name="max20String">
    <xs:restriction base="xs:string">
        <xs:maxLength value="20"/>
    </xs:restriction>
</xs:simpleType>

然后从两个元素

引用它
<xs:choice>
<xs:sequence>
    <xs:element name="OneIdType">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:maxLength value="50"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="AnotherIdType" type="tns:max20String" minOccurs="0"/>
</xs:sequence>
<xs:element name="AnotherIdType" type="tns:max20String"/>

(其中tns前缀绑定到架构&#39; s targetNamespace