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 个不同类型的元素。

另见