[英]Unique constraint in XML / XSD
I'm having a hard time trying to create validation for my xml. 我很难为xml创建验证。 This is my Schema.xsd:
这是我的Schema.xsd:
<?xml version="1.0" encoding="utf-8"?>
<!-- Schema namespace -->
<xs:schema
targetNamespace="http://tempuri.org/myschema/unique"
elementFormDefault="qualified"
xmlns="http://tempuri.org/myschema/unique"
xmlns:mstns="http://tempuri.org/myschema/unique"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Root element -->
<xs:element name="schedule">
<xs:complexType>
<xs:sequence>
<!-- Student element -->
<xs:element name="student">
<xs:complexType>
<xs:attribute name="studentName" use="required"/>
<xs:attribute name="studentId" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
<!-- School element -->
<xs:element name="school">
<xs:complexType>
<xs:sequence>
<xs:element name="name" minOccurs="0"/>
<xs:element name="term"/>
<xs:element name="program" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Weekdays element - uses clasTemplate -->
<xs:element name="weekdays">
<xs:complexType>
<xs:sequence>
<xs:element name="day" minOccurs="5" maxOccurs="5" type="dayTemplate"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- Set unique week day -->
<xs:unique name="uniqWeekday">
<xs:selector xpath="*/mstns:day"/>
<xs:field xpath="@weekday"/>
</xs:unique>
<!--Set unique week day-->
<xs:unique name="uniqHourofclass">
<xs:selector xpath="*/mstns:class"/>
<xs:field xpath="@classHour"/>
</xs:unique>
</xs:element>
<!-- ******************* Templates ******************* -->
<!-- Day Template -->
<xs:complexType name="dayTemplate">
<xs:sequence>
<xs:element name="class" minOccurs="0" maxOccurs="13" type="classTemplate"/>
</xs:sequence>
<xs:attribute name="weekday" type="weekdayOptions" use="required"/>
</xs:complexType>
<!-- Class Template -->
<xs:complexType name="classTemplate">
<xs:sequence>
<xs:element name="courseCode" type="xs:string"/>
<xs:element name="classRoom" type="xs:string"/>
</xs:sequence>
<xs:attribute name="classHour" type="hourofclassOptions" use="required"/>
</xs:complexType>
<!-- ******************* Options ******************* -->
<!-- Hour-of-class Options -->
<xs:simpleType name="hourofclassOptions">
<xs:restriction base="xs:unsignedInt">
<xs:pattern value="(800|900|1[0-9][0]{2}|2000)"/>
</xs:restriction>
</xs:simpleType>
<!-- Week Day Options -->
<xs:simpleType name="weekdayOptions">
<xs:restriction base="xs:string">
<xs:enumeration value="Monday"/>
<xs:enumeration value="Tuesday"/>
<xs:enumeration value="Wednesday"/>
<xs:enumeration value="Thursday"/>
<xs:enumeration value="Friday"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
And this is my xml: 这是我的xml:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<schedule
xmlns="http://tempuri.org/myschema/unique"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tempuri.org/myschema/unique Schema.xsd">
<student studentName="Name" studentId="123456"></student>
<school>
<name>University</name>
<term>2018</term>
<program>CPA</program>
</school>
<weekdays>
<day weekday="Monday"></day>
<day weekday="Tuesday">
<class classHour="1500">
<courseCode>ABC-123</courseCode>
<classRoom>A2020</classRoom>
</class>
<class classHour="1500">
<courseCode>EFG-456</courseCode>
<classRoom>A2758</classRoom>
</class>
</day>
<day weekday="Wednesday">
<class classHour="1500">
<courseCode>VBN-996</courseCode>
<classRoom>R8595</classRoom>
</class>
<day weekday="Thursday"/>
<day weekday="Friday"/>
</weekdays>
</schedule>
I need to validate classHour inside class. 我需要在课堂上验证classHour。 I can't have same classHour inside same day, but I can have same classHour in different days.
我不能在同一天有相同的课时,但是我可以在不同的日子有相同的课时。 I'm using namespaces.
我正在使用名称空间。 How can I make this work?
我该如何进行这项工作? What am I doing wrong?
我究竟做错了什么?
If you want to define that within a P, every Q should have a unique value for R, then define an xs:unique
constraint in the definition of P, in which xs:selector selects Q from P, and xs:field selects R from Q. 如果要在P中定义该值,则每个Q的R值都应唯一,然后在P的定义中定义一个
xs:unique
约束,其中xs:selector从P中选择Q,而xs:field从P中选择R。问
Applying that to your situation, the constraint that within a day
(P), every class
(Q) should have a unique value for hour
(R) therefore needs to be in the element declaration for day
. 将其应用于您的情况时,在
day
(P)内每个class
(Q)在hour
(R)中应具有唯一值的约束因此需要在day
的元素声明中。
Try this: 尝试这个:
<!-- Root element -->
<xs:element name="schedule">
...
<!-- Weekdays element - uses clasTemplate -->
<xs:element name="weekdays">
<xs:complexType>
<xs:sequence>
<xs:element name="day" minOccurs="5" maxOccurs="5"type="dayTemplate">
<!--Set unique week day-->
<xs:unique name="uniqHourofclass">
<xs:selector xpath="mstns:class" />
<xs:field xpath="@classHour" />
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
...
</xs:element>
In this case, <xs:unique>
constraint is under <day>
, so in the same <day>
the attribute classHour
must be unique (but can be repeated in a different <day>
). 在这种情况下,
<xs:unique>
约束位于<day>
,因此在同一<day>
,属性classHour
必须是唯一的(但可以在不同的<day>
重复)。
What you were trying to do would affect everything is under <schedule>
, as you defined like this: 您尝试执行的操作将影响
<schedule>
下的所有内容,如下所示:
<!-- Root element -->
<xs:element name="schedule">
...
<!--Set unique week day-->
<xs:unique name="uniqHourofclass">
<xs:selector xpath="mstns:weekdays/mstns:day/mstns:class"/>
<xs:field xpath="@classHour"/>
</xs:unique>
</xs:element>
So in that case, it would affect to all classHour
under <schedule>
, which means that even for different <day>
the attribute classHour
must be unique. 因此,在那种情况下,它将影响
<schedule>
下的所有classHour
,这意味着即使对于不同的<day>
, classHour
属性classHour
必须是唯一的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.