9

XML スキーマ (XSD) を定義するときに「選択」または「グループ」要素を持つことは有効ですか?

すなわち、以下は有効です

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:group ref="ReservationGroup" />
      <xs:group ref="CancellationGroup"/>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

XML メッセージは、たとえば、新しい予約または既存の予約のキャンセルのいずれかを表すことができます。

メッセージが予約の場合は、ReservationGroup グループで定義されたすべての要素を含める必要があります。

キャンセルの場合は、CancellationGroup グループで定義されたすべての要素を含める必要があります。

なんらかの理由で、私の XML エディター (Eclipse) はこれを好みませんが、その理由を示していません。行 <xs:complexType name="HeaderType"> にエラーがあることを示していますが、エラーの内容はわかりません

4

3 に答える 3

9

私は XML の専門家ではありませんが、XML はよく使用します。これは、私が一般的にこの種の構造を行う方法ではありません。2 つのグループを選択するよりも、個別の複雑な型を使用したいと思います (この回答の最後を参照してください)。

問題は、ReservationGroup と CancellationGroup が同じ要素で始まることにあると思われます。その場合、Schema Component Constraint: Unique Particle Attribution (下記) に違反します。

http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/#cos-nonambig

スキーマ コンポーネントの制約: 一意のパーティクルの属性

コンテンツ モデルは、要素情報アイテム シーケンスの「検証」中に、シーケンス内の各アイテムを順に「検証」しようとする、その中に直接、間接的、または「暗黙的に」含まれるパーティクル コンポーネントを一意に決定できるように形成する必要があります。そのアイテムの内容や属性を調べたり、シーケンスの残りのアイテムに関する情報を調べたりすることはありません。

注:この制約は、[XML 1.0 (第 2 版)] および SGML の同等の制約を XML スキーマ用に再構築します。要素置換グループとワイルドカードの存在を考えると、この制約の簡潔な表現は困難です。詳細については、一意の粒子属性制約の分析 (非規範的) (§H) を参照してください。

たとえば、次の 2 つのグループは同じ選択では無効です。最初の要素はそれぞれ「名前」であり、どのグループを見ているのかを識別できないためです。ただし、ReservationGroup の最初の要素が Cancellation グループ (resDate と cancDate など) と異なる場合は、それが有効です。

編集:私はこれまでこの種の問題に遭遇したことはありませんでした.グループの定義が完全に合法であることは魅力的だと思いますが、それらを選択肢にまとめると、各グループの定義のためにその選択は違法になります. .

法的選択を形成できないグループ

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

法的選択を形成できるグループ

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="resDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="cancDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

上で述べたように、複雑な型でこの種のことを行います。はい、それは別の要素を追加しますが、それは明白な方法のようであり、私は明白さが好きです.

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:element name="reservation" type="ReservationType" />
      <xs:element name="cancellation" type="CancellationType" />
    </xs:choice>
  </xs:sequence>
</xs:complexType>
于 2008-09-19T13:24:21.287 に答える
2

はい。これは、ReservationGroup と CancellationGroup の両方に同じ最初の要素 (それぞれ ReservationGroup の「Reservation」と Cancellationgroup の「Cancellation」の固定値を持つ「reservation-type」要素) があったためです。

于 2008-09-19T14:07:33.943 に答える
1

これが有効かどうかは、グループの内容によって異なります。「シーケンス」または「選択」モデルグループの場合、完全に合法です。「すべての」モデルグループはより問題があり、この場合は通常許可されません。

于 2008-09-19T12:24:18.043 に答える