6

既存の XSD スニペット:

<xs:element name="searchcriteria">
   <xs:complexType>
     <xs:sequence>  
       <xs:element ref="filter" 
                   minOccurs="0" 
                   maxOccurs="unbounded" />
     </xs:sequence>
     <xs:attribute name="Request" 
                   type="RequestType" />
   </xs:complexType>
 </xs:element>  


<xs:element name="filter">
   <xs:complexType>
     <xs:sequence>
       <xs:element ref="filter" 
                   minOccurs="0" 
                   maxOccurs="unbounded" />
     </xs:sequence>
     <xs:attribute name="FieldName" 
                   type="FieldNameType" />
    </xs:complexType>
 </xs:element>

...

  • RequestType : R1 と R2 の 2 つの値の列挙

  • FieldNameType : F1 と F2 の 2 つの値の列挙

ここで、この XSD を変更して、次の検証を提供したいと考えています。

  1. RequestType = R1 の場合、許可されるフィールド名は F1 と F2 です
  2. Request Type = R2 の場合、許可されるフィールド名は F1、F3、および F4 です。(新しい列挙が必要な場合があります)

そのような検証を追加するにはどうすればよいですか? ありがとう。

4

1 に答える 1

7

XSD (および他のほとんどの XML スキーマ言語) の基本的な考え方は、検証動作を要素の型にバインドすることです。インスタンスの 1 つのセットをある方法で検証し、別のインスタンスのセットを別の方法で検証したい場合 (アイデアに従う)、それらが実際には 2 つの異なるタイプの要素であり、2 つの異なる名前を持つ必要があるという一応の証拠です。

したがって、説明したように XSD でリクエストを検証する最も簡単な方法は、要素を と という名前の要素のペアに置き換えることsearchcriteriaです。必要に応じて、さまざまな型で宣言します。それぞれに、適切な列挙型を持つ属性を持つ名前の要素があるか、またはを子として宣言し、 、 、またはのいずれかを選択できると宣言します。 .R1R2filterR1F1F2R2F1F3F4

これを行うことができない、または行わない場合は、XSD 1.1 とその条件付き型割り当て機能をsearchcriteria使用して、2 つの型 (そうでなければ forR1とに使用する 2 つの型) を宣言R2し、値に基づいて適切な型を割り当てることができます。Request属性。アサーションを使用しsearchcriteriaて共制約を確認することもできます。

XSD 1.1 バリデーターにアクセスできない場合は、XSD 1.0 バリデーターのベンダーにアップグレードを希望することを伝え、Schematron アサーションを使用して制約を確認してください。

オプションのより具体的な説明と例については、この本質的に同様の質問も参照してください。

于 2013-06-01T22:03:54.857 に答える