XML 架构 (XSD 1.1) 取决于其他属性的动态枚举



我有一个相当简单的XML结构;

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

我想将"name"的值限制为一组特定的名称,具体取决于元素"person"的属性"type"的值。

因此,例如,如果<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>

这对我真的不起作用。我有一种感觉,当我在test="@type='NAME_WITH_A'"中提到另一个元素的@type属性时,它总是错误的。

我也尝试了test="list / members / person / @type='NAME_WITH_A'"但没有成功。

您在使用条件类型赋值时有正确的想法,但您将其应用于错误的元素。 而不是将其应用于name,您必须将其应用于person(其类型将根据type属性而变化的元素(。 从那里,您可以改变person的内容模型,以具有不同类型的name元素。

另请参阅如何使用条件类型赋值使类型依赖于属性值

最新更新