xml的唯一性属性& XSD中的元素级别值

时间:2017-11-28 12:39:02

标签: xml xsd

我有一个xsd文件在RequestNo(属性级别)具有唯一性。现在我想为EmpID添加一个唯一性(在元素级别)。

注意RequestNo唯一性工作正常但不适用于元素级别(EmpID)。

我试过下面的代码。但它不起作用。任何人都可以纠正我。

XSD:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
    <xs:element name="ArrayRequests" type="rootNode">
        <xs:unique name="uniqueID">
            <xs:selector xpath=".//*" />
            <xs:field xpath="@RequestNo" />
        </xs:unique>
    </xs:element>
    <xs:complexType name="rootNode">
        <xs:sequence>
            <xs:element name="Requests">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="unbounded" name="Request">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element minOccurs="0" name="AddEmp">
                                        <xs:complexType>
                                            <xs:sequence>
                                                <xs:element name="EmpID" type="xs:string" minOccurs="1" maxOccurs="unbounded" />
                                                <xs:element name="FullName" type="xs:string" minOccurs="1" maxOccurs="unbounded" />
                                                <xs:element name="Sal" type="xs:string" minOccurs="0"/>
                                                <xs:element name="Dept" type="xs:string" minOccurs="1" />
                                                <xs:element name="Address" type="xs:string" minOccurs="0"/>
                                                <xs:element name="Email" minOccurs="0" xsi:nil="true" type="xs:string" />  
                                            </xs:sequence>
                                        </xs:complexType>
                                        <xs:unique name="uniqueEmpID">
                                          <xs:selector xpath="EmpID"/>
                                          <xs:field xpath="."/>
                                        </xs:unique>
                                    </xs:element>
                                </xs:sequence>
                                <xs:attribute name="RequestNo" type="xs:string" use="required" />
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>    

我的XML

<?xml version="1.0"?>
<ArrayRequests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <Requests>
    <Request RequestNo="Emp001">
        <AddEmp>
                <EmpID>1001</EmpID>
                <FullName>FullName-1</FullName>
                <Sal>1000</Sal>
                <Dept>Dept1</Dept>
                <Address>Address2</Address>
                <Email>testCP@gmail.com</Email>
        </AddEmp>
    </Request>
    <Request RequestNo="Emp002">
        <AddEmp>
                <EmpID>1001</EmpID>
                <FullName>FullName2-1</FullName>
                <Sal>20000</Sal>
                <Dept>Dep1</Dept>
                <Address>Address2</Address>
                <Email>testCP@gmail.com</Email>
        </AddEmp>
    </Request>
</Requests>
</ArrayRequests>

1 个答案:

答案 0 :(得分:1)

你几乎是他们的,但你说的是&#39; EmpID&#39;在每个AddEmp&#39;中必须是唯一的。元素,但因为你只允许1&#39; EmpID&#39;在每个&#39; AddEmp&#39;这是默认的。

您需要将规则应用于较低的范围。我假设你是想说'EmpID&#39;在&#39; ArrayRequests&#39;的上下文中必须是唯一的,在这种情况下,以下代码将提供您需要的验证。

<xs:element name="ArrayRequests" type="rootNode">
    <xs:unique name="uniqueID">
        <xs:selector xpath=".//*" />
        <xs:field xpath="@RequestNo" />
    </xs:unique>
    <xs:unique name="uniqueEmpID">
        <xs:selector xpath="./Requests/Request/AddEmp" />
        <xs:field xpath="EmpID" />
    </xs:unique>
</xs:element>

注意:能够将此规则直接应用于&#39; EmpID&#39;会很好,但是在唯一约束中使用的xpath表达式无法回顾(即../不可访问),因此它必须在树中更高的位置应用。