CIS97 YT > Midterm Project 1 > Relax NG Projects > Roster Markup Language Grammar

Relax NG Projects
Roster Markup Language

Project Index | Documentation | Relax NG | Sample XML File

<!-- ============================================================================ -->
<!--  Author: Marie Taylor-Harper                                                 -->
<!--  Lab #:  Midterm (Relax NG)                                                  -->
<!--  Due   : June 4, 2002                                                        -->
<!--  Associated Files:                                                           -->
<!--    taylorharper_m_midterm.xml                                                -->
<!-- ============================================================================ -->

<grammar xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">

<start>

  <element name="roster">

    <ref name="def-school-info" />

    <ref name="def-course-info" />

    <ref name="def-instructor-info" />

    <element name="students">
      <ref name="def-students" />
    </element>

  </element>

</start>

 <!-- ============================================================================ -->
 <!--                       School Information Definition                          -->
 <!-- ============================================================================ -->

  <define name="def-school-info">
    <element name="school-info">
      <element name="school-name">
        <choice>
          <value type="string">Foothill</value>
          <value type="string">De Anza</value>
        </choice>
      </element>
      <element name="school-address">
        <ref name="def-address" />
      </element>
      <element name="school-phone">
        <ref name="def-phone" />
      </element>
    </element> 
  </define>

 <!-- ============================================================================ -->
 <!--                       Course Information Definition                          -->
 <!-- ============================================================================ -->

  <define name="def-course-info">
    <element name="course-info">
      <element name="course-code">
        <data type="string">
          <param name="pattern">[A-Z]{3}\d{3}[a-z]?</param>
        </data>
      </element>
      <element name="course-section">
        <data type="string">
          <param name="pattern">\d{2}[A-Z]?</param>
        </data>
      </element>
      <element name="course-desc">
        <ref name="def-MixedText" />
      </element> 
      <element name="term">
        <choice>
          <value type="string">Fall</value>
          <value type="string">Winter</value>
          <value type="string">Spring</value>
          <value type="string">Summer</value>
        </choice>
      </element>
      <element name="term-length">
        <choice>
          <value type="string">6</value>
          <value type="string">8</value>
          <value type="string">11</value>
          <value type="string">15</value>
        </choice>
      </element>
      <element name="year">
        <data type="string">
          <param name="pattern">\d{4}</param>
        </data>
      </element>
    </element> 
  </define>

 <!-- ============================================================================ -->
 <!--                       Instructor Information Definition                      -->
 <!-- ============================================================================ -->

  <define name="def-instructor-info">
    <element name="instructor-info">
      <element name="instructor-name">
        <ref name="def-name" />
      </element>
      <element name="instructor-address">
        <ref name="def-address" />
      </element>
      <element name="instructor-phone">
        <ref name="def-phone" />
      </element>
      <element name="instructor-ssn">
        <data type="string">
          <param name="pattern">\d{3}-\d{2}-\d{4}</param>
        </data>
      </element>
    </element>
  </define>

 <!-- ============================================================================ -->
 <!--                       Student Information Definition                         -->
 <!-- ============================================================================ -->

  <define name="def-students">
    <oneOrMore>
      <element name="student-info">
        <element name="student-name">
          <ref name="def-name" />
        </element>
        <element name="student-id">
          <data type="string">
            <param name="pattern">\d{9}</param>
          </data>
        </element>

        <oneOrMore>
          <element name="student-phone">
            <ref name="def-phone" />
            <attribute name="type">
              <choice>
                <value type="string">Home</value>
                <value type="string">Work</value>
                <value type="string">Mobile</value>
              </choice>
            </attribute>
          </element>
        </oneOrMore>

        <oneOrMore>
          <element name="email">
            <data type="string">
              <param name="pattern">[-._A-Za-z0-9]+@([-A-Za-z0-9]+\.)+(com|org|net|edu|[a-z]{1,3})</param>
            </data>
          </element>
        </oneOrMore>

        <optional>            
          <element name="nt-username">
            <data type="string">
              <param name="pattern">\S*</param>
            </data>
          </element>
        </optional>

        <element name="unix-username">
          <data type="string">
            <param name="pattern">\S*</param>
          </data>
        </element>

        
        <element name="password-info">
          <element name="class-id">
            <data type="string">
              <param name="pattern">\d{4}</param>
            </data>
          </element>

          <element name="password">
            <data type="string">
              <param name="pattern">\S*</param>
            </data>
          </element>

          <element name="mothers-maiden-name">
            <data type="string">
              <param name="pattern">[A-Z][-a-z]*</param>
            </data>
          </element>
        </element>
      
                          
        <element name="attendance">
          <ref name="def-attendance" />
        </element>

        <element name="grades">
          <ref name="def-grades" />
        </element>

      </element>

    </oneOrMore>
  </define>

 <!-- ============================================================================ -->
 <!--                             Attendance Definition                            -->
 <!-- ============================================================================ -->

  <define name="def-attendance">
    <oneOrMore>
      <element name="period">
        <ref name="def-date" />
        <element name="tardiness">
          <choice>
            <value type="string">Present</value>
            <value type="string">Late</value>
            <value type="string">Absent</value>
            <value type="string">Excused</value>
          </choice>
        </element>
      </element>
    </oneOrMore>
  </define>

 <!-- ============================================================================ -->
 <!--                                Grades Definition                             -->
 <!-- ============================================================================ -->

  <define name="def-grades">
    <interleave>
      <text />
      <zeroOrMore>
        <element name="assignment">
          <ref name="def-assignment" />
        </element>
      </zeroOrMore>
      <zeroOrMore>
        <element name="midterm">
          <ref name="def-exam" />
        </element>
      </zeroOrMore>
      <optional>
        <element name="final">
          <ref name="def-exam" />
        </element>
      </optional>
    </interleave>
  </define>



  <define name="def-assignment">
    <ref name="def-date" />
    <element name="assignment-num">
      <data type="string">
        <param name="pattern">(1)?[0-9]</param>
      </data>
    </element>
    <element name="description">
      <ref name="def-MixedText" />
    </element>
    <element name="summary">
      <ref name="def-MixedText" />
    </element>
    <ref name="def-grade" />    
  </define>


  <define name="def-exam">
    <ref name="def-date" />
    <element name="start-time">
      <ref name="def-time" />
    </element>
    <element name="end-time">
      <ref name="def-time" />
    </element>      
    <ref name="def-grade" />
  </define>
  

  <define name="def-grade">    
    <element name="grade">
      <element name="percentage">
        <data type="string">
          <param name="pattern">\d{1,3}</param>
        </data>
      </element>
      <choice>
        <element name="letter-grade">
          <choice>
            <value type="string">A</value>
            <value type="string">B</value>
            <value type="string">C</value>
            <value type="string">D</value>
            <value type="string">F</value>
          </choice>
        </element>
        <element name="passfail-grade">
          <choice>
            <value type="string">P</value>
            <value type="string">NP</value>
          </choice>
        </element>
      </choice>
    </element>
  </define>

 <!-- ============================================================================ -->
 <!--                             Reuseable Definitions                            -->
 <!-- ============================================================================ -->

  <define name="def-address">
    <element name="address">
      <text />
    </element>
    <element name="city">
      <text />
    </element>
    <element name="state">
      <data type="string">
        <param name="pattern">[A-Z]{2}</param>
      </data>
    </element>
    <element name="zipcode">
      <data type="string" />
    </element>
    <optional>
      <element name="country">
        <text />
      </element>
    </optional>
  </define>


  <define name="def-date">
    <element name="date">
      <data type="string">
        <param name="pattern">([1-9]|1[012])-([1-9]|[12][0-9]|3[01])-\d{4}</param>
      </data>
      <optional>
        <attribute name="late">
          <choice>
            <value type="string">Yes</value>
            <value type="string">No</value>
          </choice>
        </attribute>
      </optional>
    </element>
  </define>
  
 
  <define name="def-name">
    <element name="first-name">
      <data type="string">
        <param name="pattern">[A-Z][a-z]*(-[A-Z][a-z]*)*</param>
      </data>
    </element>
    <optional>
      <element name="initial">
        <data type="string">
          <param name="pattern">[A-Z]</param>
        </data>
      </element>
    </optional>
    <element name="last-name">
      <data type="string">
        <param name="pattern">[A-Z][a-z]*(-[A-Z][a-z]*)*</param>
      </data>
    </element>
  </define>
  
  
  <define name="def-phone">
    <data type="string">
      <param name="pattern">\d{3}\.\d{3}\.\d{4}</param>
    </data>
  </define>


  <define name="def-time">
    <data type="string">
      <param name="pattern">(2[0-3]|[01]?[0-9]):[0-5][0-9]:[0-5][0-9]</param>
    </data>
  </define>

 
 <!-- ============================================================================ -->
 <!--                            MixedText Definition                              -->
 <!-- ============================================================================ -->

  <define name="def-MixedText">
    <interleave>
      <text />
      <zeroOrMore>
        <ref name="Inline" />
      </zeroOrMore>
    </interleave>
  </define>

    <!-- ========================================================================== -->
    <!-- The following is the Relax NG definition for Inline elements which include -->
    <!-- the Emphasis element and the Strong element.  These elements may also      -->
    <!-- contain text or other Inline elements.                                     -->
    <!-- ========================================================================== -->

  <define name="Inline" ns="http://www.w3.org/1999/xhtml">
    <choice>
      <element name="em">    <!-- Emphasis Element -->
        <interleave>
          <text />
          <zeroOrMore>
            <ref name="Inline" />
         </zeroOrMore>
        </interleave>
      </element>
      <element name="strong">    <!-- Strong Emphasis Element -->
        <interleave>
          <text />
          <zeroOrMore>
            <ref name="Inline" />
         </zeroOrMore>
        </interleave>
      </element>
    </choice>
  </define>
 
</grammar>