interleave

<?xml version="1.0"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">

  <start>
  
    <element name="SONG">
      <element name="TITLE">
        <text/>
      </element>
      <interleave>
          
          <oneOrMore>
            <element name="COMPOSER">
              <ref name="personContent"/>
            </element>
          </oneOrMore>
          
          <zeroOrMore>
            <element name="PRODUCER">
              <ref name="personContent"/>
            </element>
          </zeroOrMore>
          
          <optional>
            <element name="PUBLISHER">
              <text/>
            </element>
          </optional>
          <optional>
            <element name="LENGTH">
              <text/>
            </element>
          </optional>
          <optional>
            <element name="YEAR">
              <text/>
            </element>
          </optional>
          <oneOrMore>
            <element name="ARTIST">
              <text/>
            </element>
          </oneOrMore>
      </interleave>
    </element>
    
  </start>

  <define name="personContent">
    <element name="NAME">
      <interleave>
      <element name="GIVEN">
        <text/>
      </element>
      <element name="FAMILY">
        <text/>
      </element>
      </interleave>
    </element>
  </define>

</grammar>

start =
  element SONG {
    element TITLE        { text },
    (element COMPOSER    { personContent }+
     & element PRODUCER  { personContent }*
     & element PUBLISHER { text }?
     & element LENGTH    { text }?
     & element YEAR      { text }?
     & element ARTIST    { text }+)
  }
personContent =
  element NAME {
    element GIVEN    { text }
    & element FAMILY { text }
  }

Previous | Next | Top | Cafe con Leche

Copyright 2005, 2006 Elliotte Rusty Harold
elharo@metalab.unc.edu
Last Modified January 2, 2006