0

有没有办法让元素在相同的序列(选择,全部)中唯一,但不是在整个文档中。

例如,这应该有效(约翰和简都将弗朗西斯作为中间名):

<students xsi:noNamespaceSchemaLocation="stack.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <student>
        <name>John</name>
        <middlename>Francis</middlename>
        <middlename>Mike</middlename>
        <lastname>Doe</lastname>
    </student>
    <student>
        <name>Jane</name>
        <middlename>Francis</middlename>
        <lastname>Doe</lastname>
    </student>
</students>

但这应该行不通(约翰有两个相似的中间名):

<students xsi:noNamespaceSchemaLocation="stack.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <student>
        <name>John</name>
        <middlename>Francis</middlename>
        <middlename>Francis</middlename>
        <lastname>Doe</lastname>
    </student>
</students>

到目前为止,我已经尝试过关注我的 .xsd 文件:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="students">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element name="student">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string"/>
                            <xs:sequence minOccurs="0" maxOccurs="5">
                                <xs:element name="middlename" type="xs:string"/>
                            </xs:sequence>
                            <xs:element name="lastname" type="xs:string"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
        
        <xs:unique name="middlename_unique">
            <xs:selector xpath="student/middlename"/>
            <xs:field xpath="."></xs:field>
        </xs:unique>
    </xs:element>
</xs:schema>

但这只会使中间名一般来说是独一无二的,而不是单个学生......

4

1 回答 1

0

https://www.w3.org/TR/xmlschema-0/#specifyingUniqueness

XML Schema 使我们能够指示任何属性或元素值在特定范围内必须是唯一的。为了表明一个特定的属性或元素值是唯一的,我们首先使用唯一元素来“选择”一组元素,然后识别与每个选定元素相关的属性或元素“字段”,这些元素在该元素中必须是唯一的。选定元素集的范围。

所以我想你想要

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="students">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element name="student">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="xs:string"/>
                            <xs:sequence minOccurs="0" maxOccurs="5">
                                <xs:element name="middlename" type="xs:string"/>
                            </xs:sequence>
                            <xs:element name="lastname" type="xs:string"/>
                        </xs:sequence>
                    </xs:complexType>
                    <xs:unique name="middlename_unique">
                        <xs:selector xpath="middlename"/>
                        <xs:field xpath="."/>
                    </xs:unique>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
于 2021-04-28T18:59:06.170 回答