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

时间:2017-08-18 13:12:31

标签: xml xsd 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">,只有名称

  • 安娜
  • 阿达
  • 阿曼达

应该是有效的, if <person type="NAME_WITH_B">,仅

  • Berta,
  • 鲍勃
  • 布雷特

应该是<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属性,它总是错误的。

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

1 个答案:

答案 0 :(得分:1)

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

另请参阅 How to make type depend on attribute value using Conditional Type Assignment