2017-08-18 2 views
1

私はかなり単純なXML構造を持っています。XML Schema(XSD 1.1)他の属性に依存する動的列挙

<list... > 
    <members> 
     <person type="NAME_WITH_A"> 
      <name>Ada</name> 
     </person> 
     <person type="NAME_WITH_B"> 
      <name>Berta</name> 
     </person> 
    </members> 
</list> 

私は、要素「人の属性「タイプ」の値に応じて、名前の特定のセットに「名前」の値を制限したいです。

ので、例えば、<person type="NAME_WITH_A">場合は、名前だけ

  • アンナ
  • エイダ
  • アマンダ

有効である必要があり、 <person type="NAME_WITH_B">場合、としてのみ

  • ベルタ、
  • ボブ
  • ブレット

<name>要素の有効な値でなければなりません。

<xs:schema xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="list"> 
</xs:element> 

<xs:element name="person"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="name"/> 
     </xs:sequence> 
     <xs:attribute name="type" use="required"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:enumeration value="NAME_WITH_A"/> 
        <xs:enumeration value="NAME_WITH_B"/> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
</xs:element> 

<xs:element name="name"> 
    <xs:alternative test="@type='NAME_WITH_A'" type="choice_names_A"/> 
    <xs:alternative test="@type='NAME_WITH_B'" type="choice_names_B"/> 
    <xs:alternative type="xs:error"/> 
</xs:element> 

<xs:element name="members"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="person" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:simpleType name="choice_names_A"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="Anna"/> 
     <xs:enumeration value="Ada"/> 
     <xs:enumeration value="Amanda"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="choice_names_B"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="Berta"/> 
     <xs:enumeration value="Bob"/> 
     <xs:enumeration value="Bret"/> 
    </xs:restriction> 
</xs:simpleType> 
</xs:schema> 

本当に私のために動作しません:

this questionによると、私は、次のスキーマを作成しました。私はtest="@type='NAME_WITH_A'"を別の要素の@type属性に参照すると、常にfalseであるという気持ちがあります。

私もtest="list/members/person/@type='NAME_WITH_A'"を試しましたが、成功しませんでした。

答えて

1

あなたは条件付きタイプの割り当てを使用するのに正しい考え方を持っていますが、間違った要素に適用しています。これをnameに適用する代わりに、person(タイプがtype属性によって異なる要素)に適用する必要があります。ここからpersonのコンテンツモデルを変更して、異なるタイプの要素をnameにすることができます。

How to make type depend on attribute value using Conditional Type Assignmentも参照してください。

関連する問題