2

我正在尝试扩展一个复杂类型以更改其 minOccurs 值,但我尝试了不同的方法均未成功,这是我的基本类型:

    <xs:complexType name="PhoneNumberType">
    <xs:sequence>
        <xs:element name="AreaCode">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="[0-9]+" />
                    <xs:maxLength value="3" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="LocalNumber">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="[0-9]+" />
                    <xs:minLength value="7" />
                    <xs:maxLength value="17" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="Extension" minOccurs="0">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="[0-9]+" />
                    <xs:maxLength value="5" />
                </xs:restriction>
            </xs:simpleType>                
        </xs:element>
    </xs:sequence>
</xs:complexType>

首先,我尝试使 AreaCode 在特定情况下成为可选:

            <xs:element name="PhoneNumberWithOptionalAreaCode">
            <xs:complexType>
            <xs:complexContent>
                <xs:extension base="PhoneNumberType">
                    <xs:sequence>
                        <xs:element name="AreaCode" type="xs:string" minOccurs="0" />
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
            </xs:complexType>
        </xs:element>

它给了我一个错误,说具有相同名称的元素应该具有相同的类型。

所以我尝试了这个:

    <xs:complexType name="PhoneNumberType">
    <xs:sequence>
        <xs:element name="AreaCode" type="AreaCodeType" />
        <xs:element name="LocalNumber">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="[0-9]+" />
                    <xs:minLength value="7" />
                    <xs:maxLength value="17" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="Extension" minOccurs="0">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="[0-9]+" />
                    <xs:maxLength value="5" />
                </xs:restriction>
            </xs:simpleType>                
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="AreaCodeType">
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]+" />
        <xs:maxLength value="3" />
    </xs:restriction>
</xs:simpleType>

    <xs:element name="PhoneNumberWithOptionalAreaCode">
        <xs:complexType>
        <xs:complexContent>
            <xs:extension base="PhoneNumberType">
                <xs:sequence>
                    <xs:element name="AreaCode" type="AreaCodeType" minOccurs="0" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
        </xs:complexType>
    </xs:element>

现在 xsd 是有效的,但是当我尝试验证以下 xml 时,它说 LocalNumber 不是预期的,预期的 AreaCode。

<PhoneNumberWithOptionalAreaCode>
    <LocalNumber>1234567</LocalNumber>
</PhoneNumberWithOptionalAreaCode>

任何人都可以帮忙吗?

谢谢 !

4

1 回答 1

1

您不能使用任何扩展/限制来使强制元素在较低层次结构中成为可选元素。有关此内容的更多信息,请参阅 XML Schema 规范:Restriction

如果您有控制权,唯一可能的解决方案是反转层次结构。做为PhoneNumberWithOptionalAreaCode基础并PhoneNumberType扩展PhoneNumberWithOptionalAreaCode

于 2013-01-12T01:41:48.760 回答