XML / XSD中的唯一约束

时间:2018-02-22 04:39:17

标签: xml xsd xsd-validation

我很难尝试为我的xml创建验证。 这是我的Schema.xsd:

UITableViewDataSource

这是我的xml:

<?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>

我需要验证classHour里面的类。我不能在同一天内同时上课,但我可以在不同的日子里有同一个班级。 我正在使用名称空间。 我怎样才能做到这一点?我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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必须是唯一的(但可以在不同的{{}中重复1}})。

您尝试做的事情会影响<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>也必须是唯一的。