2017-08-10 11 views
0

複数のcomplexType要素で使用される要素間で一意の値を適用しようとしています。例えばXSDの要素間で一意の値

<lmt> 
    <lf> 
     <pos>1</pos> 
     ... more elements ... 
    </lf> 
    <cdl> 
     <pos>1</pos> 
     ... more elements ... 
    </cdl> 
</lmt> 

しかし

<lmt> 
    <lf> 
     <pos>1</pos> 
     ... more elements ... 
    </lf> 
    <cdl> 
     <pos>2</pos> 
     ... more elements ... 
    </cdl> 
</lmt> 

を検証し、現在の両方を検証するように見える:

<xs:element name="lmt"> 
    <xs:complexType> 
     <xs:choice maxOccurs="unbounded"> 
      <xs:element ref="lf" maxOccurs="unbounded"/> 
      <xs:element ref="cdl" maxOccurs="unbounded"/> 
     </xs:choice> 
    </xs:complexType> 
    <xs:unique name="uniquePos"> 
     <xs:selector xpath="./*/pos"/> 
     <xs:field xpath="."/> 
    </xs:unique> 
</xs:element> 

<xs:element name="pos"> 
    <xs:simpleType> 
     <xs:restriction base="xs:integer"> 
      <xs:pattern value="\d{1}"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

<xs:element name="lf"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="pos"/> 
      ... more elements ... 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="cdl"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="pos"/> 
      ... more elements ... 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

私はのようなものを持っている場合、これは失敗したいと思います。私は./*/pos.//posの両方をセレクタに試しましたが、最初の例で検証が失敗することがあります。

答えて

1

要素A内のすべてのBにCの一意の値を設定したい場合は、要素Aに一意制約を定義する必要があります。selector式はAからBを選択し、field式はBからCを選択します。

あなたのケースでは、私たちには示されていないコンテナ要素に制約が定義されていなければなりません。lfcdlを子として持ちます。選択は.//posまたはおそらく./*/posであり、フィールドは.

+0

になるはずです。追加の詳細レベルで質問を更新しました。あなたが提案したように私が実装しているかどうかは分かりませんが、セレクタとして '.// pos'と' ./*/ pos'の両方を使用しても、拒否したい場合は許可します。ご協力いただきありがとうございます。 – agf1997

+0

「pos」へのXpath参照の名前空間を使用する必要があります。 ''は働いた – agf1997

関連する問題