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

<!-- 
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2005-2006  Donald N. Allingham
#
# 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.1.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>
        <optional><element name="researcher">
            <ref name="researcher-content"/>
        </element></optional>
      </element>

      <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="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="bookmarks">
          <zeroOrMore><element name="bookmark">
              <ref name="bookmark-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="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="primary-object">
    <attribute name="id"><text/></attribute>
    <attribute name="handle"><data type="ID"/></attribute>
    <optional><attribute name="priv"><choice>
        <value>0</value>
        <value>1</value>
    </choice></attribute></optional>
    <optional><attribute name="marker"><text/></attribute></optional>
    <attribute name="change"><text/></attribute>
  </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>
    <optional><element name="nick"><text/></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="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">
        <attribute name="hlink"><data type="IDREF"/></attribute>
        <optional><attribute name="priv">
            <ref name="priv-content"/>
        </attribute></optional>
        <attribute name="rel"><text/></attribute>
    </element></zeroOrMore>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
    <zeroOrMore><element name="sourceref">
        <ref name="sourceref-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>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="last">
        <text/>
        <optional><attribute name="prefix"><text/></attribute></optional>
        <optional><attribute name="group"><text/></attribute></optional>
    </element></optional>
    <optional><element name="suffix"><text/></element></optional>
    <optional><element name="patronymic"><text/></element></optional>
    <optional><element name="title"><text/></element></optional>
    <optional><ref name="date-content"/></optional>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
    <zeroOrMore><element name="sourceref">
        <ref name="sourceref-content"/>
    </element></zeroOrMore>
  </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="city"><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>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
    <optional><element name="sourceref">
        <ref name="sourceref-content"/>
    </element></optional>
  </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>
        </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>
        </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>
    </element></zeroOrMore>
    <zeroOrMore><element name="attribute">
        <ref name="attribute-content"/>
    </element></zeroOrMore>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
    <optional><ref name="date-content"/></optional>
    <zeroOrMore><element name="sourceref">
        <ref name="sourceref-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="cause"><text/></element></optional>
    <optional><element name="description"><text/></element></optional>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
    <zeroOrMore><element name="sourceref">
        <ref name="sourceref-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="objref">
        <ref name="objref-content"/>
    </element></zeroOrMore>
  </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>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
    <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"><data type="float"/></attribute>
        <attribute name="lat"><data type="float"/></attribute>
    </element></optional>
    <zeroOrMore><element name="location">
        <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>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
    <zeroOrMore><element name="sourceref">
        <ref name="sourceref-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>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
    <optional><ref name="date-content"/></optional>
    <zeroOrMore><element name="sourceref">
        <ref name="sourceref-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>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
  </define>

  <define name="bookmark-content">
    <attribute name="hlink"><data type="IDREF"/></attribute>
  </define>
  
  <define name="note-content">
    <optional><attribute name="format"><choice>
        <value>0</value>
        <value>1</value>
    </choice></attribute></optional>
    <text/>
  </define>

  <define name="sourceref-content">
    <attribute name="hlink"><data type="IDREF"/></attribute>
    <optional><attribute name="conf"><text/></attribute></optional>
    <optional><element name="spage"><text/></element></optional>
    <optional><element name="scomments"><text/></element></optional>
    <optional><element name="stext"><text/></element></optional>
    <optional><ref name="date-content"/></optional>
  </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>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
  </define>

  <define name="reporef-content">
    <attribute name="hlink"><data type="IDREF"/></attribute>
    <optional><attribute name="callno"><text/></attribute></optional>
    <optional><attribute name="medium"><text/></attribute></optional>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
  </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="sourceref">
        <ref name="sourceref-content"/>
    </element></zeroOrMore>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
  </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>
    <zeroOrMore><element name="attribute">
        <ref name="attribute-content"/>
    </element></zeroOrMore>
    <zeroOrMore><element name="sourceref">
        <ref name="sourceref-content"/>
    </element></zeroOrMore>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
  </define>

  <define name="lds-content">
    <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>
    <optional><element name="note">
        <ref name="note-content"/>
    </element></optional>
    <optional><ref name="date-content"/></optional>
    <zeroOrMore><element name="sourceref">
        <ref name="sourceref-content"/>
    </element></zeroOrMore>
  </define>

</grammar>
