XML Schema (XSD 1.1) 依赖于其他属性的动态枚举
XML Schema (XSD 1.1) Dynamic enumeration depending on other attribute
我有一个相当简单的 XML 结构;
<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'"
中提到的另一个元素的 @type 属性一样,它始终为 false。
我也试过 test="list / members / person / @type='NAME_WITH_A'"
但没有成功。
您使用条件类型分配的想法是正确的,但是您将其应用到了错误的元素上。不是将它应用于 name
,而是必须将它应用于 person
(类型将根据 type
属性而变化的元素)。从那里,您可以改变 person
的内容模型以具有 name
个不同类型的元素。
另见 。
我有一个相当简单的 XML 结构;
<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'"
中提到的另一个元素的 @type 属性一样,它始终为 false。
我也试过 test="list / members / person / @type='NAME_WITH_A'"
但没有成功。
您使用条件类型分配的想法是正确的,但是您将其应用到了错误的元素上。不是将它应用于 name
,而是必须将它应用于 person
(类型将根据 type
属性而变化的元素)。从那里,您可以改变 person
的内容模型以具有 name
个不同类型的元素。
另见