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スキーマ仕様を参照してください。制限

可能な解決策は、制御できる場合に階層を反転することだけです。ベースPhoneNumberWithOptionalAreaCodeとして作成し、PhoneNumberType拡張しますPhoneNumberWithOptionalAreaCode

于 2013-01-12T01:41:48.760 に答える