XML / XSD中的唯一约束
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML / XSD中的唯一约束相关的知识,希望对你有一定的参考价值。
我正在努力为我的xml创建验证。这是我的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>
这是我的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>
我需要验证classHour里面的类。我不能在同一天内同时上课,但我可以在不同的日子里有同一个班级。我正在使用名称空间。我怎样才能做到这一点?我究竟做错了什么?
答案
如果要在P内定义,则每个Q应该具有R的唯一值,然后在P的定义中定义xs:unique
约束,其中xs:selector从P中选择Q,并且xs:field从Q中选择R.
将其应用于您的情况,day
(P)中的约束,每个class
(Q)应该具有hour
(R)的唯一值,因此需要在day
的元素声明中。
另一答案
试试这个:
<!-- 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>
在这种情况下,<xs:unique>
约束在<day>
下,因此在相同的<day>
中,属性classHour
必须是唯一的(但可以在不同的<day>
中重复)。
您尝试做的事情会影响<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>
因此,在这种情况下,它将影响classHour
下的所有<schedule>
,这意味着即使对于不同的<day>
,属性classHour
必须是唯一的。
以上是关于XML / XSD中的唯一约束的主要内容,如果未能解决你的问题,请参考以下文章
Spring主配置文件(applicationContext.xml) 导入约束