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">, only

  • 伯塔,
  • 鲍勃
  • 布雷特

<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'",但没有成功。

4

1 回答 1

1

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

另请参阅如何使用 Conditional Type Assignment 使类型取决于属性值

于 2017-08-18T13:41:37.497 回答