我有一个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>
答案 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表达式无法回顾(即../不可访问),因此它必须在树中更高的位置应用。