0

固定値を使用して xsd の xs:choices を区別することは可能ですか? 私は単純なタイプを持っています:

<xs:simpleType name="datatypeCategory">
    <xs:restriction base="xs:string">
        <xs:enumeration value="SIMPLE"/>
        <xs:enumeration value="COMPLEX"/>
        <xs:enumeration value="COLLECTION"/>
    </xs:restriction>
</xs:simpleType>

そして、私が達成したいのは

<xs:element name="datatype">
    <xs:complexType>
        <xs:choice>
            <xs:sequence>
                <xs:element id="category" type="datatypeCategory" fixed="SIMPLE"/>
                <!-- some fields specific for SIMPLE -->
            </xs:sequence>
            <xs:sequence>
                <xs:element id="category" type="datatypeCategory" fixed="COMPLEX"/>
                <!-- some fields specific for COMPLEX -->
            </xs:sequence>
            <xs:sequence>
                <xs:element id="category" type="datatypeCategory" fixed="COLLECTION"/>
                <!-- some fields specific for COLLECTION -->
            </xs:sequence>
        </xs:choice>
    </xs:complexType>
</xs:element>

これを行うと、私の XMLSpy は次のように教えてくれます:

# The content model of complex type definition '{anonymous}' is ambiguous.
# Details: cos-nonambig: <xs:element name='category'> makes the content model non-deterministic against <xs:element name='category'>. Possible causes: name equality, overlapping occurrence or substitution groups.
4

2 に答える 2

1

あなたは正確にそれを行うことはできません. エラーが発生するのは、要素を認識した単純なバリデーターが、<category>どのブランチを選択するかをすぐには判断できないためです。XML Schema 1.0 は、そのような単純なバリデーターをサポートしています。

別の方法は、カテゴリに従って各要素に名前を付けることです。

<xs:element name="datatype">
    <xs:complexType>
        <xs:choice>
            <xs:sequence>
                <xs:element name="simpleCategory" type="empty"/>
                <!-- some fields specific for SIMPLE -->
            </xs:sequence>
            <xs:sequence>
                <xs:element name="complexCategory" type="empty"/>
                <!-- some fields specific for COMPLEX -->
            </xs:sequence>
            <xs:sequence>
                <xs:element name="collectionCategory" type="empty"/>
                <!-- some fields specific for COLLECTION -->
            </xs:sequence>
        </xs:choice>
    </xs:complexType>
</xs:element>

whereemptyは空の型として定義されています。または、「特定のフィールド」を保持する複合型を指定します。置換グループや派生複合型の使用など、制約に応じて他の代替手段があります。

ただし、一般に、XML スキーマ 1.0 は、相互に関連する値に基づく制約には適していません。そのためには、XML Schema 1.1 または外部ツールにアクセスする必要があります。

于 2011-03-10T01:24:57.543 に答える
0

ID はドキュメント内で一意である必要があります。複数の要素で同じ値を使用することはできません。

http://www.w3.org/TR/2006/REC-xml11-20060816/#id

于 2011-03-09T19:33:12.443 に答える