XSD架构中的唯一元素

时间:2017-06-05 12:07:50

标签: xml xsd

我正在编写一个xml架构。我希望某个节点基于某些内部元素是唯一的。我写了下面的架构,但它无法正常工作。我可以多次添加同一本书/员工。我希望我的书名/员工应该是唯一的,如果有人输入重复元素(节点)则通过例外 有人可以帮助我吗?提前谢谢。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com" targetNamespace="http://www.w3schools.com" elementFormDefault="unqualified">

<xs:complexType name="employee">
    <xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="employees">
    <xs:sequence>
        <xs:element name="employees" type="employee" minOccurs="0" maxOccurs="unbounded">
            <xs:unique name="uniqueId">
                <xs:selector xpath="employee"/>
                <xs:field xpath="@id"/>
            </xs:unique>
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="book">
    <xs:sequence>
        <xs:attribute name="author" type="xs:string" use="required"/>
        <xs:attribute name="title" type="xs:string" use="required"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="bookList">
    <xs:sequence>
        <xs:element name="bookList" type="book" minOccurs="0" maxOccurs="unbounded">
            <xs:unique name="uniqueBook">
                <xs:selector xpath="book"/>
                <xs:field xpath="@title"/>
            </xs:unique>
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:element name="Library">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="bookList" type="bookList"/>
            <xs:element name="employees" type="employees"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>

1 个答案:

答案 0 :(得分:0)

您的架构表明id元素的employee属性必须是唯一的,但在您的架构和实例中(作为评论发布),employee元素都不是有一个id属性;相反,它有一个title属性。

此外,您的employeebook元素在模式中声明为在命名空间中(尽管您的实例中缺少此命名空间),并且在定义选择器时忽略了此命名空间/您的唯一性约束中的字段XPath表达式。