XML / XSD中的唯一约束

问题描述 投票:0回答:2

我正在努力为我的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里面的类。我不能在同一天内同时上课,但我可以在不同的日子里有同一个班级。我正在使用名称空间。我怎样才能做到这一点?我究竟做错了什么?

xml xsd xsd-validation
2个回答
1
投票

如果要在P内定义,则每个Q应该具有R的唯一值,然后在P的定义中定义xs:unique约束,其中xs:selector从P中选择Q,并且xs:field从Q中选择R.

将其应用于您的情况,day(P)中的约束,每个class(Q)应该具有hour(R)的唯一值,因此需要在day的元素声明中。


1
投票

试试这个:

<!-- 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必须是唯一的。

© www.soinside.com 2019 - 2024. All rights reserved.