2017-08-18 104 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'的值爲一組名稱。

因此,舉例來說,如果<person type="NAME_WITH_A">,只有人名

  • 安娜
  • 阿達
  • 阿曼達

應該是有效的, 如果<person type="NAME_WITH_B">,只有

  • 貝爾塔,
  • 鮑勃
  • 佈雷特

應該是<name>元素有效值。

根據this question我創建了以下模式:

<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> 

它並沒有真正爲我工作。我有這樣的感覺,因爲我在test="@type='NAME_WITH_A'"中提到ANOTHER元素的@type屬性,它總是爲false。

我也試過test="list/members/person/@type='NAME_WITH_A'"但沒有成功。

回答