2

3つのプロパティを持つオブジェクトがある状況があります:1)アクション2)ID 3)名前

ActionUpdateまたはである可能性がRemoveあり、必須です。IDはintであり、必須です。名前は文字列であり、の場合はオプションであり、の場合Action=Removeは必須Action=Updateです。

これをXSDでどのように説明しますか?ありがとうございました!

ジム

これは私がこれまでに持っているものです:

   <s:element name="UpdateAccount">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="myAccount" type="tns:WSUpdate" />
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:complexType name="WSUpdate">
    <s:sequence>
      <s:element minOccurs="1" maxOccurs="1" name="ID" type="s:int" />
      <s:element minOccurs="1" maxOccurs="1" name="Name" nillable="false" type="s:string" />
      <s:element minOccurs="1" maxOccurs="1" name="action" type="tns:UpdateAction" />
    </s:sequence>
  </s:complexType>
  <s:simpleType name="UpdateAction">
    <s:restriction base="s:string">
      <s:enumeration value="Update" />
      <s:enumeration value="Remove" />
    </s:restriction>
  </s:simpleType>

編集2012年9月12日@9:28am EST: もう少し考えた後、私は何かにパッチを当てました。これは私が探していたものではありませんが、おそらくクライアントが受け入れるのに十分近いものです。条件の詳細には正確には入りませんが、クライアントに構造定義を提供します。どう思いますか?

  <s:element name="UpdateAccount">
    <s:complexType>
      <s:sequence>
        <s:choice>
    <s:element minOccurs="0" maxOccurs="1" name="myAccount" type="tns:WSUpdate" />
    <s:element minOccurs="0" maxOccurs="1" name="myAccount" type="tns:WSDelete" />
    </s:choice>
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:complexType name="WSUpdate">
    <s:sequence>
      <s:element minOccurs="1" maxOccurs="1" name="ID" type="s:int" />
      <s:element minOccurs="1" maxOccurs="1" name="Name" nillable="false" type="s:string" />
      <s:element minOccurs="1" maxOccurs="1" name="action" type="tns:UpdateAction" />
    </s:sequence>
  </s:complexType>
  <s:complexType name="WSDelete">
    <s:sequence>
      <s:element minOccurs="1" maxOccurs="1" name="ID" type="s:int" />
      <s:element minOccurs="0" maxOccurs="1" name="Name" nillable="true" type="s:string" />
      <s:element minOccurs="1" maxOccurs="1" name="action" type="tns:UpdateAction" />
    </s:sequence>
  </s:complexType>
  <s:simpleType name="UpdateAction">
    <s:restriction base="s:string">
      <s:enumeration value="Update" />
      <s:enumeration value="Remove" />
    </s:restriction>
  </s:simpleType>
4

2 に答える 2

3

XSD 1.0で問題を解決する簡単な方法の1つは、問題の条件を少し変更することです。現在のWSUpdate要素を同じ名前の抽象要素に置き換えます。定義Updateし、Removeそれに代わることができる要素。Update必要に応じて、属性をオプションまたは必須として宣言しますRemove

XSD 1.0でこのような条件をチェックするために必要なのは、条件が要素名に依存し、要素の他のプロパティには依存しないことだけです。

[2012年9月12日編集:OPはより完全な例を求めています。]

これは、抽象的な要素の使用の簡単な例です。

まず、UpdateAccounttypeをローカルで宣言するのではなく、その子要素を参照するようにします。これにより、他の要素もそれを参照し、代わりに使用できると宣言できます。

<xs:element name="UpdateAccount">
  <xs:complexType>
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" 
                  ref="tns:myAccount" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

myAccount次に、要素自体を抽象要素として宣言します。実際に名前myAccountが付けられた要素は受け入れられず、の代わりに使用可能であると宣言された具体的な要素のみが受け入れられmyAccountます。

<xs:element name="myAccount" abstract="true"/>

次に、の代わりに使用できる2つの具象要素を宣言myAccountし、適切な制約のある型を指定します。action子要素は不要になりました。削除と更新の違いは、要素の名前(vs update)で示されるようになりましたremove

<xs:element name="update" type="tns:WSUpdate" 
            substitutionGroup="tns:myAccount"/>
<xs:complexType name="WSUpdate">
  <xs:sequence>
    <xs:element minOccurs="1" maxOccurs="1" 
                name="ID" type="xs:int" />
    <xs:element minOccurs="1" maxOccurs="1" 
                name="Name" nillable="false" type="xs:string" />
  </xs:sequence>
</xs:complexType>

<xs:element name="remove" type="tns:WSDelete" 
            substitutionGroup="tns:myAccount"/>
<xs:complexType name="WSDelete">
  <xs:sequence>
    <xs:element minOccurs="1" maxOccurs="1" 
                name="ID" type="xs:int" />
    <xs:element minOccurs="0" maxOccurs="1" 
                name="Name" 
                nillable="false" type="xs:string" />
  </xs:sequence>
</xs:complexType>

myAccount状況によっては、要素を名前付きタイプ(tns:WSUpdate元の例のように)を持つものとして宣言し、タイプとそのタイプのupdate制限removeとして宣言することが望ましい場合があります。そうすると、例がやや長くて退屈になるので、ここで言及することに満足します。それが理にかなっているかどうかは、スキーマを維持する人々をどれだけ信頼できるか、そして他のスキーマ認識ツールがその情報を使って有用なことをするかどうかに依存します。

于 2012-09-12T23:22:44.540 に答える
1

ある属性のルールが別の属性の値に依存するというあなたが説明する状況は、しばしば「共起制約」と呼ばれ、XSD1.0ではそれを行う方法がありません。XSD 1.1では、「条件付き型割り当て」と呼ばれるメカニズムを使用して完全にサポートされていますが、これを使用するには、XSDバリデーターとしてSaxonまたはXercesを採用する必要があります。

于 2012-09-11T23:16:36.930 に答える