<?xml version="1.0" encoding="UTF-8"?>

<!-- 
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2005-2007  Donald N. Allingham
# Copyright (C) 2010-2011  Nick Hall
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

# Written by Alex Roitman

# $Id$
-->

<!--
  This is the RELAX NG schema for the GRAMPS XML genealogy data format.
-->


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

  <start><element name="database">
    
      <element name="header">
        <element name="created">
            <attribute name="date"><data type="date"/></attribute>
            <attribute name="version"><text/></attribute>
        </element>
        <element name="researcher">
            <optional>
            <ref name="researcher-content"/>
            </optional>
        </element>
        <optional>
           <element name="mediapath"><text/>
           </element>
        </optional>
      </element>

      <optional><element name="name-formats">
          <zeroOrMore><element name="format">
              <ref name="format-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="tags">
          <zeroOrMore><element name="tag">
              <ref name="tag-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="events">
          <zeroOrMore><element name="event">
              <ref name="event-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="people">
          <optional><attribute name="default"><text/></attribute></optional>
          <optional><attribute name="home">
              <data type="IDREF"/>
          </attribute></optional>
          <zeroOrMore><element name="person">
              <ref name="person-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="families">
          <zeroOrMore><element name="family">
              <ref name="family-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="citations">
          <zeroOrMore><element name="citation">
              <ref name="citation-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="sources">
          <zeroOrMore><element name="source">
              <ref name="source-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="places">
          <zeroOrMore><element name="placeobj">
              <ref name="place-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="objects">
          <zeroOrMore><element name="object">
              <ref name="object-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="repositories">
          <zeroOrMore><element name="repository">
              <ref name="repository-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="notes">
          <zeroOrMore><element name="note">
              <ref name="note-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="bookmarks">
          <zeroOrMore><element name="bookmark">
              <ref name="bookmark-content"/>
          </element></zeroOrMore>
      </element></optional>

      <optional><element name="namemaps">
          <zeroOrMore><element name="map">
              <ref name="map-content"/>
          </element></zeroOrMore>
      </element></optional>
  </element></start>

  <define name="researcher-content">
      <element name="resname"><text/></element>
      <optional><element name="resaddr"><text/></element></optional>
      <optional><element name="reslocality"><text/></element></optional>
      <optional><element name="rescity"><text/></element></optional>
      <optional><element name="resstate"><text/></element></optional>
      <optional><element name="rescountry"><text/></element></optional>
      <optional><element name="respostal"><text/></element></optional>
      <optional><element name="resphone"><text/></element></optional>
      <optional><element name="resemail"><text/></element></optional>
  </define>

  <define name="table-object">
    <attribute name="handle"><data type="ID"/></attribute>
    <attribute name="change"><text/></attribute>
  </define>

  <define name="primary-object">
    <ref name="table-object"/>
    <optional><attribute name="id"><text/></attribute></optional>
    <optional><attribute name="priv"><choice>
        <value>0</value>
        <value>1</value>
    </choice></attribute></optional>
  </define>

  <define name="person-content">
    <ref name="primary-object"/>
    <element name="gender"><choice>
        <value>M</value>
        <value>F</value>
        <value>U</value>
    </choice></element>
    <zeroOrMore><element name="name">
        <ref name="name-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="eventref">
        <ref name="eventref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="lds_ord">
        <ref name="lds-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="objref">
        <ref name="objref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="address">
        <ref name="address-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="attribute">
        <ref name="attribute-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="url">
        <ref name="url-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="childof">
        <attribute name="hlink"><data type="IDREF"/></attribute>
    </element></zeroOrMore>
    <zeroOrMore><element name="parentin">
        <attribute name="hlink"><data type="IDREF"/></attribute>
    </element></zeroOrMore>
    <zeroOrMore><element name="personref">
        <ref name="personref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="citationref">
        <ref name="citationref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="tagref">
        <ref name="tagref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="child-rel">
    <choice>
      <value>Birth</value>
      <value>Adopted</value>
      <value>Stepchild</value>
      <value>Sponsored</value>
      <value>Foster</value>
      <value>None</value>
      <value>Other</value>
      <value>Unknown</value>
    </choice>
  </define>

  <define name="name-content">
    <optional><attribute name="alt"><choice>
        <value>0</value>
        <value>1</value>
    </choice></attribute></optional>
    <optional><attribute name="priv">
        <ref name="priv-content"/>
    </attribute></optional>
    <optional><attribute name="type"><choice>
        <value>Unknown</value>
        <value>Also Known As</value>
        <value>Birth Name</value>
        <value>Married Name</value>
        <value>Other Name</value>
    </choice></attribute></optional>
    <optional><attribute name="sort"><text/></attribute></optional>
    <optional><attribute name="display"><text/></attribute></optional>
    <optional><element name="first"><text/></element></optional>
    <optional><element name="call"><text/></element></optional>
    <zeroOrMore><element name="surname">
        <ref name="surname-content"/>
    </element></zeroOrMore>
    <optional><element name="suffix"><text/></element></optional>
    <optional><element name="title"><text/></element></optional>
    <optional><element name="nick"><text/></element></optional>
    <optional><element name="familynick"><text/></element></optional>
    <optional><element name="group"><text/></element></optional>
    <optional><ref name="date-content"/></optional>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="citationref">
        <ref name="citationref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="surname-content">
    <text/>
    <optional><attribute name="prefix"><text/></attribute></optional>
    <optional><attribute name="prim"><choice>
    <value>1</value>
    <value>0</value>
    </choice></attribute></optional>
    <optional><attribute name="derivation"><choice>
    <value>Unknown</value>
    <value>Inherited</value>
    <value>Given</value>
    <value>Taken</value>
    <value>Patronymic</value>
    <value>Matronymic</value>
    <value>Feudal</value>
    <value>Pseudonym</value>
    <value>Patrilineal</value>
    <value>Matrilineal</value>
    <value>Occupation</value>
    <value>Location</value>
    </choice></attribute></optional>
    <optional><attribute name="connector"><text/></attribute></optional>
  </define>

  <define name="address-content">
    <optional><attribute name="priv">
        <ref name="priv-content"/>
    </attribute></optional>
    <optional><ref name="date-content"/></optional>
    <optional><element name="street"><text/></element></optional>
    <optional><element name="locality"><text/></element></optional>
    <optional><element name="city"><text/></element></optional>
    <optional><element name="county"><text/></element></optional>
    <optional><element name="state"><text/></element></optional>
    <optional><element name="country"><text/></element></optional>
    <optional><element name="postal"><text/></element></optional>
    <optional><element name="phone"><text/></element></optional>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="citationref">
        <ref name="citationref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="date-content">
      <choice>
        <element name="daterange">
            <attribute name="start"><text/></attribute>
            <attribute name="stop"><text/></attribute>
            <optional><attribute name="quality"><choice>
                <value>estimated</value>
                <value>calculated</value>
            </choice></attribute></optional>
            <optional><attribute name="cformat"><text/></attribute></optional>
        <optional><attribute name="dualdated">
                <choice><value>0</value><value>1</value></choice>
        </attribute></optional>
        <optional><attribute name="newyear"><text/></attribute></optional>
        </element>
        <element name="datespan">
            <attribute name="start"><text/></attribute>
            <attribute name="stop"><text/></attribute>
            <optional><attribute name="quality"><choice>
                <value>estimated</value>
                <value>calculated</value>
            </choice></attribute></optional>
            <optional><attribute name="cformat"><text/></attribute></optional>
        <optional><attribute name="dualdated">
                <choice><value>0</value><value>1</value></choice>
        </attribute></optional>
        <optional><attribute name="newyear"><text/></attribute></optional>
        </element>
        <element name="dateval">
            <attribute name="val"><text/></attribute>
            <optional><attribute name="cformat"><text/></attribute></optional>
            <optional><attribute name="type"><choice>
                <value>before</value>
                <value>after</value>
                <value>about</value>
            </choice></attribute></optional>
            <optional><attribute name="quality"><choice>
                <value>estimated</value>
                <value>calculated</value>
            </choice></attribute></optional>
        <optional><attribute name="dualdated">
                <choice><value>0</value><value>1</value></choice>
        </attribute></optional>
        <optional><attribute name="newyear"><text/></attribute></optional>
        </element>
        <element name="datestr">
            <attribute name="val"><text/></attribute>
        </element>
      </choice>
  </define>

  <define name="family-content">
    <ref name="primary-object"/>
    <optional><element name="rel">
        <attribute name="type"><text/></attribute>
    </element></optional>
    <optional><element name="father">
        <attribute name="hlink"><data type="IDREF"/></attribute>
    </element></optional>
    <optional><element name="mother">
        <attribute name="hlink"><data type="IDREF"/></attribute>
    </element></optional>
    <zeroOrMore><element name="eventref">
        <ref name="eventref-content"/>
            </element></zeroOrMore>
    <zeroOrMore><element name="lds_ord">
        <ref name="lds-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="objref">
        <ref name="objref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="childref">
        <attribute name="hlink"><data type="IDREF"/></attribute>
        <optional><attribute name="priv">
            <ref name="priv-content"/>
        </attribute></optional>
        <optional><attribute name="mrel">
            <ref name="child-rel"/>
        </attribute></optional>
        <optional><attribute name="frel">
            <ref name="child-rel"/>
        </attribute></optional>
        <zeroOrMore><element name="citationref">
            <ref name="citationref-content"/>
        </element></zeroOrMore>
        <zeroOrMore><element name="noteref">
            <ref name="noteref-content"/>
        </element></zeroOrMore>
    </element></zeroOrMore>
    <zeroOrMore><element name="attribute">
        <ref name="attribute-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
    <optional><ref name="date-content"/></optional>
    <zeroOrMore><element name="citationref">
        <ref name="citationref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="tagref">
        <ref name="tagref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="event-content">
    <ref name="primary-object"/>
    <element name="type"><text/></element>
    <optional><ref name="date-content"/></optional>
    <optional><element name="place">
        <attribute name="hlink"><data type="IDREF"/></attribute>
    </element></optional>
    <optional><element name="description"><text/></element></optional>
    <zeroOrMore><element name="attribute">
        <ref name="attribute-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="citationref">
        <ref name="citationref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="objref">
        <ref name="objref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="citation-content">
    <ref name="primary-object"/>
    <optional><ref name="date-content"/></optional>
    <optional><element name="page"><text/></element></optional>
    <optional><element name="confidence"><text/></element></optional>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="objref">
        <ref name="objref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="data_item">
        <attribute name="key"><text/></attribute>
        <attribute name="value"><text/></attribute>
    </element></zeroOrMore>
    <element name="sourceref">
        <ref name="sourceref-content"/>
    </element>
  </define>

  <define name="source-content">
    <ref name="primary-object"/>
    <optional><element name="stitle"><text/></element></optional>
    <optional><element name="sauthor"><text/></element></optional>
    <optional><element name="spubinfo"><text/></element></optional>
    <optional><element name="sabbrev"><text/></element></optional>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="objref">
        <ref name="objref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="data_item">
        <attribute name="key"><text/></attribute>
        <attribute name="value"><text/></attribute>
    </element></zeroOrMore>
    <zeroOrMore><element name="reporef">
        <ref name="reporef-content"/>
    </element></zeroOrMore>
  </define>

  <define name="place-content">
    <ref name="primary-object"/>
    <optional><element name="ptitle"><text/></element></optional>
    <optional><element name="coord">
        <attribute name="long"><text/></attribute>
        <attribute name="lat"><text/></attribute>
    </element></optional>
    <zeroOrMore><element name="location">
        <optional><attribute name="street"><text/></attribute></optional>
        <optional><attribute name="locality"><text/></attribute></optional>
        <optional><attribute name="city"><text/></attribute></optional>
        <optional><attribute name="parish"><text/></attribute></optional>
        <optional><attribute name="county"><text/></attribute></optional>
        <optional><attribute name="state"><text/></attribute></optional>
        <optional><attribute name="country"><text/></attribute></optional>
        <optional><attribute name="postal"><text/></attribute></optional>
        <optional><attribute name="phone"><text/></attribute></optional>
    </element></zeroOrMore>
    <zeroOrMore><element name="objref">
        <ref name="objref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="url">
        <ref name="url-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="citationref">
        <ref name="citationref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="object-content">
    <ref name="primary-object"/>
    <element name="file">
        <attribute name="src"><text/></attribute>
        <attribute name="mime"><text/></attribute>
        <attribute name="description"><text/></attribute>
    </element>
    <zeroOrMore><element name="attribute">
        <ref name="attribute-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
    <optional><ref name="date-content"/></optional>
    <zeroOrMore><element name="citationref">
        <ref name="citationref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="tagref">
        <ref name="tagref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="repository-content">
    <ref name="primary-object"/>
    <optional><element name="rname"><text/></element></optional>
    <optional><element name="type"><text/></element></optional>
    <zeroOrMore><element name="address">
        <ref name="address-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="url">
        <ref name="url-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="bookmark-content">
    <attribute name="target"><choice>
        <value>person</value>
        <value>family</value>
        <value>event</value>
        <value>source</value>
        <value>place</value>
        <value>media</value>
        <value>repository</value>
        <value>note</value>
    </choice></attribute>
    <attribute name="hlink"><data type="IDREF"/></attribute>
  </define>
  
  <define name="map-content">
    <attribute name="type"><choice>
        <value>group_as</value>
    </choice></attribute>
    <attribute name="key"><text/></attribute>
    <attribute name="value"><text/></attribute>
  </define>

  <define name="format-content">
    <attribute name="number"><text/></attribute>
    <attribute name="name"><text/></attribute>
    <attribute name="fmt_str"><text/></attribute>
    <optional><attribute name="active"><choice>
        <value>0</value>
        <value>1</value>
    </choice></attribute></optional>
  </define>

  <define name="note-content">
    <ref name="primary-object"/>
    <optional><attribute name="format"><choice>
        <value>0</value>
        <value>1</value>
    </choice></attribute></optional>
    <attribute name="type"><text/></attribute>
    <ref name="styledtext"/>
    <zeroOrMore><element name="tagref">
        <ref name="tagref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="styledtext">
    <element name="text"><text/></element>
    <zeroOrMore><element name="style">
      <attribute name="name"><choice>
          <value>bold</value>
          <value>italic</value>
          <value>underline</value>
          <value>fontface</value>
          <value>fontsize</value>
          <value>fontcolor</value>
          <value>highlight</value>
          <value>superscript</value>
          <value>link</value>
      </choice></attribute>
      <optional><attribute name="value"><text/></attribute></optional>
      <oneOrMore><element name="range">
        <attribute name="start"><data type="int"/></attribute>
        <attribute name="end"><data type="int"/></attribute>
      </element></oneOrMore>
    </element></zeroOrMore>
  </define>

  <define name="citationref-content">
    <attribute name="hlink"><data type="IDREF"/></attribute>
  </define>
    
  <define name="sourceref-content">
    <attribute name="hlink"><data type="IDREF"/></attribute>
  </define>
    
  <define name="eventref-content">
    <attribute name="hlink"><data type="IDREF"/></attribute>
    <optional><attribute name="priv">
        <ref name="priv-content"/>
    </attribute></optional>
    <optional><attribute name="role"><text/></attribute></optional>
    <zeroOrMore><element name="attribute">
        <ref name="attribute-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="reporef-content">
    <attribute name="hlink"><data type="IDREF"/></attribute>
    <optional><attribute name="priv">
        <ref name="priv-content"/>
    </attribute></optional>
    <optional><attribute name="callno"><text/></attribute></optional>
    <optional><attribute name="medium"><text/></attribute></optional>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="noteref-content">
    <attribute name="hlink"><data type="IDREF"/></attribute>
  </define>

  <define name="priv-content">
      <choice>
          <value>0</value>
          <value>1</value>
      </choice>
  </define>
  
  <define name="attribute-content">
    <optional><attribute name="priv">
        <ref name="priv-content"/>
    </attribute></optional>
    <attribute name="type"><text/></attribute>
    <attribute name="value"><text/></attribute>
    <zeroOrMore><element name="citationref">
        <ref name="citationref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="url-content">
      <optional><attribute name="priv">
          <ref name="priv-content"/>
      </attribute></optional>
      <optional><attribute name="type"><text/></attribute></optional>
      <attribute name="href"><text/></attribute>
      <optional><attribute name="description"><text/></attribute></optional>
  </define>

  <define name="objref-content">
    <attribute name="hlink"><data type="IDREF"/></attribute>
    <optional><attribute name="priv">
        <ref name="priv-content"/>
    </attribute></optional>
    <optional><element name="region">
        <ref name="region-content"/>
    </element></optional>    
    <zeroOrMore><element name="attribute">
        <ref name="attribute-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="citationref">
        <ref name="citationref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="lds-content">
    <optional><attribute name="priv">
        <ref name="priv-content"/>
    </attribute></optional>
    <attribute name="type"><text/></attribute>
    <optional><ref name="date-content"/></optional>
    <optional><element name="temple">
        <attribute name="val"><text/></attribute>
    </element></optional>
    <optional><element name="place">
        <attribute name="hlink"><data type="IDREF"/></attribute>
    </element></optional>
    <optional><element name="status">
        <attribute name="val"><text/></attribute>
    </element></optional>
    <optional><element name="sealed_to">
        <attribute name="hlink"><data type="IDREF"/></attribute>
    </element></optional>
    <zeroOrMore><element name="noteref">
        <ref name="noteref-content"/>
    </element></zeroOrMore>
    <optional><ref name="date-content"/></optional>
    <zeroOrMore><element name="citationref">
        <ref name="citationref-content"/>
    </element></zeroOrMore>
  </define>

  <define name="region-content">
    <attribute name="corner1_x"><data type="integer"/></attribute>
    <attribute name="corner1_y"><data type="integer"/></attribute>
    <attribute name="corner2_x"><data type="integer"/></attribute>
    <attribute name="corner2_y"><data type="integer"/></attribute>
    <text/>
  </define>

  <define name="tagref-content">
    <attribute name="hlink"><data type="IDREF"/></attribute>
  </define>

  <define name="tag-content">
    <ref name="table-object"/>
      <attribute name="name"><text/></attribute>
      <attribute name="color"><text/></attribute>
      <attribute name="priority"><data type="integer"/></attribute>
  </define>

</grammar>
