简体   繁体   English

XML / XSD中的唯一约束

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM