[Home] [By Thread] [By Date] [Recent Entries]

  • From: "Costello, Roger L." <costello@m...>
  • To: "xml-dev@l..." <xml-dev@l...>
  • Date: Sat, 16 Apr 2011 13:04:54 -0400

Hi Folks,

There are many examples where the start and end time (date, dateTime) must be recorded:

Example #1

Record the start and end time of a meeting. The meeting starts at 9am and ends at 10am:

    <meeting>
        <start>09:00:00</start>
        <end>10:00:00</end>
    </meeting>

Example #2

Record the start and end date of a conference. The conference starts on August 3, 2011 and ends on August 6, 2011:

    <conference>
        <start>2011-08-03</start>
        <end>2011-08-06</end>
    </conference>

Example #3

Sometimes there is a start date but no end date. The person started working for a company on October 9, 1990 and is still employed:

    <employment>
        <start>1990-10-09</start>
    </employment>

Example #4

A person left Beijing at 4pm on Saturday and arrived in New York at 2pm the same day!  

    <flight>
        <start>2007-07-08T16:00:00+08:00</start>
        <end>2007-07-08T14:00:00-05:00</end>
    </flight>


Rule: End Value is Greater Than Start Value

Common among all the examples is that the end value is greater than the start value:

  - The meeting end time is greater than the meeting start time.
  - The conference end date is greater than the conference start date.
  - The flight end date/time, when adjusted for time zone differences, is greater than the flight start date/time.

There is a co-constraint between the value of end and the value of start.

This is an ideal candidate for a portable data component. We can create an XML Schema complexType that declares the start and end elements, and use the new assert element to express the co-constraint:

    <xs:complexType name="start-end-date-time">
        <xs:sequence>
            <xs:element name="start">
                <xs:simpleType>
                    <xs:union memberTypes="xs:date xs:time 
                                           xs:dateTime" />
                </xs:simpleType>
            </xs:element>
            <xs:element name="end" minOccurs="0">
                <xs:simpleType>
                    <xs:union memberTypes="xs:date xs:time 
                                           xs:dateTime" />
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
        <xs:assert test="
              if (exists(end)) then 
                  if (start castable as xs:dateTime) then
                      xs:dateTime(end) gt xs:dateTime(start)
                  else if (start castable as xs:date) then
                      xs:date(end) gt xs:date(start)
                  else if (start castable as xs:time) then
                      xs:time(end) gt xs:time(start)
                  else true()
              else true()" />
    </xs:complexType>

Comments welcome.

/Roger


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index]


Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member