<?xml version="1.0"?>
<!--
Simple XML for Chess - a slightly modified ChessGML subset.

Copyright (c) Ari Makela 2003

$Id: sxc-schema.xml,v 1.23 2004/11/06 08:30:14 hauva Exp $

VERSION 0.02b

-->

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:appinfo>
      SXC, Simple XML for chess, is a very much simplified and 
      little modified ChessGML. SXC will likely grow more complex
      as the demands of Grue project grow. Now just problems and games 
      with no variations or annotations are supported. 
      
      There are some changes when compared to ChessGML
      
      * player element with surname and firstname child elements
      * opening element with nic, eco and name child elements
      * the c (colour) attribute of the p element is not obligatory because
        it can usually be found from the parent element..
    </xs:appinfo>
  </xs:annotation>

  <xs:element name="m" maxOccurs="2">
    <xs:annotation>
      <xs:documentation>
	A half move.
      </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="p" minOccurs="1" maxOccurs="1"/>
	<xs:element name="sq" minOccurs="2" maxOccurs="2">
	<xs:annotation>
	  <xs:documentation>
	    The from and to squares. 
	  </xs:documentation>
	</xs:annotation>
	<xs:complexType>
	  <xs:attribute name="n" type="xs:string" minOccurs="1" maxOccurs="1">
	    <xs:annotation>
	      <xs:documentation>
		The square as a string. Valid values are a1-h8.
	      </xs:documentation>
	    </xs:annotation>
	  </xs:attribute>
	</xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="c" type="xs:string">
      <xs:annotation>
	<xs:documentation>
	  The side that is moving. w for White and b for black.
	</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="capt" type="xs:integer">
      <xs:annotation>
	<xs:documentation>
	  1 if the move is a capture.
	</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="chk" type="xs:integer">
      <xs:annotation>
	<xs:documentation>
	  1 if the move is a check.
	</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="mate" type="xs:integer">
      <xs:annotation>
	<xs:documentation>
	  1 if the move is a mate.
	</xs:documentation>
      </xs:annotation>
      </xs:attribute>
      <xs:attribute name="prpi" type="xs:string">
	<xs:annotation>
	  <xs:documentation>
	    The piece a pawn is promoted to.
	  </xs:documentation>
	</xs:annotation>
      </xs:attribute>
      <xs:attribute name="dsan" type="xs:string">
	<xs:annotation>
	  <xs:documentation>
	    The move as a SAN string.
	  </xs:documentation>
	</xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <xs:element name="player">
    <xs:annotation>
      <xs:documentation>
	The player in a chess game.
      </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
	<xs:element name="surname">
	  <xs:annotation>
	    <xs:documentation>
	      The surname of a player.
	    </xs:documentation>
	  </xs:annotation>
	</xs:element>
	<xs:element name="firstname">
	  <xs:annotation>
	    <xs:documentation>
	      The first name of a player.
	    </xs:documentation>
	  </xs:annotation>
	</xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="date">
    <xs:annotation>
      <xs:documentation>
	The date of a game.
      </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="year" type="xs:integer">
	<xs:annotation>
	  <xs:documentation>
	    The year of a date.
	  </xs:documentation>
	</xs:annotation>
      </xs:attribute>
      <xs:attribute name="month" type="xs:integer">
	<xs:annotation>
	  <xs:documentation>
	    The month of a date.
	  </xs:documentation>
	</xs:annotation>
      </xs:attribute>
      <xs:attribute name="day" type="xs:integer">
	<xs:annotation>
	  <xs:documentation>
	    The day of a date.
	  </xs:documentation>
	</xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <xs:element name="p" minOccurs="1" maxOccurs="1">
    <xs:annotation>
      <xs:documentation>
	The piece which is moving. 
      </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="c" type="xs:string" minOccurs="0" maxOccurs="1">
	<xs:annotation>
	  <xs:documentation>
	    The colour of the piece.
	  </xs:documentation>
	</xs:annotation>
      </xs:attribute>
      <xs:attribute name="n" type="xs:string" minOccurs="1" maxOccurs="1">
	<xs:annotation>
	  <xs:documentation>
	    The symbol of a piece.
	    Valid values are k, q, r, b, n and p.
	  </xs:documentation>
	</xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
 
  <xs:element name="position">
    <xs:annotation>
      <xs:documentation>
	The current position.
      </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
	<xs:element name="rank" minOccurs="0" maxOccurs="8">
	  <xs:annotation>
	    <xs:documentation>
	      A rank of the chess board.
	    </xs:documentation>
	  </xs:annotation>
	  <xs:complexType>
	    <xs:sequence>
	      <xs:element name="file" minOccurs="0" maxOccurs="7">
		<xs:annotation>
		  <xs:documentation>
		    A file of the chess board.
		  </xs:documentation>
		</xs:annotation>
		<xs:complexType>
		  <xs:sequence>
		    <xs:element ref="p" minOccurs="1" maxOccurs="1">
		      <xs:annotation>
			<xs:documentation>
			  A rank of the chess board.
			</xs:documentation>
		      </xs:annotation>
		    </xs:element>
		  </xs:sequence>
		  <xs:attribute name="f" type="xs:integer">
		    <xs:annotation>
		      <xs:documentation>
			The file. One of 'a'-'h'.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:attribute>
		</xs:complexType>
	      </xs:element>    
	    </xs:sequence>
	    <xs:attribute name="r" type="xs:integer">
	      <xs:annotation>
	        <xs:documentation>
		  The rank. One of '1'-'8'.
		</xs:documentation>
	      </xs:annotation>
	    </xs:attribute>
	  </xs:complexType>
	</xs:element>
      </xs:sequence>
      <xs:attribute name="type" type="xs:string">
	<xs:annotation>
	  <xs:documentation>
	    The type of the position. "start" is currently the only attribute.
	  </xs:documentation>
	</xs:annotation>
      </xs:attribute>
      <xs:attribute name="active" type="xs:string">
	<xs:annotation>
	  <xs:documentation>
	    The active side. Either 'w' or 'b'.
	  </xs:documentation>
	</xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <xs:element name="chess">
    <xs:annotation>
      <xs:documentation>
	The root element for SXC.
      </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
	<xs:element name="documentinfo" minOccurs="0" maxOccurs="1">
	  <xs:complexType>
	    <xs:sequence>
	      <xs:element name="source" minOccurs="0" maxOccurs="0">
	      </xs:element>
	      <xs:element name="date" minOccurs="0" maxOccurs="0">
	      </xs:element>
	      <xs:element name="copyright" minOccurs="0" maxOccurs="0">
	      </xs:element>
	      <xs:element name="abstract" minOccurs="0" maxOccurs="1">
	      </xs:element>
	    </xs:sequence>
	  </xs:complexType>
	</xs:element>

<!-- problems start -->
	<xs:element name="problems" minOccurs="0" maxOccurs="unbounded">
	  <xs:annotation>
	    <xs:documentation>
	      A set of problems.
	    </xs:documentation>
	  </xs:annotation>
	  <xs:complexType>
	    <xs:sequence>
	      <xs:element name="problem" maxOccurs="unbounded">
		<xs:annotation>
		  <xs:documentation>
		    A problem.
		  </xs:documentation>
		</xs:annotation>
		<xs:complexType>
		  <xs:sequence>
		    <xs:element ref="date" minOccurs="0" maxOccurs="1"/>
		    <xs:element ref="position" minOccurs="0" maxOccurs="1"/>
		    <xs:element name="active" minOccurs="1" maxOccurs="1">
		      <xs:annotation>
			<xs:documentation>
			  The side to move in human readable format i.e 
			  "White to move" or "Black to move".
			</xs:documentation>
		      </xs:annotation>
		    </xs:element>
		    <xs:element name="task" minOccurs="1" maxOccurs="1">
		      <xs:annotation>
			<xs:documentation>
			  What should the active side achive?
			</xs:documentation>
		      </xs:annotation>
		    </xs:element>
		    <xs:element name="moves" maxOccurs="1">
		      <xs:annotation>
			<xs:documentation>
			  The container for moves.
			</xs:documentation>
		      </xs:annotation>
		      <xs:complexType>
			<xs:sequence>
			  <xs:element ref="m" minOccurs="0"/>
			</xs:sequence>
			<xs:attribute name="ply-count" type="xs:integer">
			  <xs:annotation>
			    <xs:documentation>
			      The number of plies.
			    </xs:documentation>
			  </xs:annotation>
			</xs:attribute>
		      </xs:complexType>
		    </xs:element>
		  </xs:sequence>
		  <xs:attribute name="id" type="xs:integer">
		    <xs:annotation>
		      <xs:documentation>
			Unique numeric id for the problem.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:attribute>
		</xs:complexType>
	      </xs:element>
	    </xs:sequence>
	  </xs:complexType>
	</xs:element>
<!-- problems end -->

	<xs:element name="game" minOccurs="0" maxOccurs="unbounded">
	  <xs:annotation>
	    <xs:documentation>
	      A game of chess.
	    </xs:documentation>
	  </xs:annotation>
	  <xs:complexType>
	    <xs:sequence>
	      <xs:element name="gameinfo">
		<xs:annotation>
		  <xs:documentation>
		    The roster information i.e. who, where, when and so on.
		  </xs:documentation>
		</xs:annotation>
		<xs:complexType>
		  <xs:sequence>
		    <xs:element name="eventinfo">
		      <xs:annotation>
			<xs:documentation>
			  The container for site and event information.
			</xs:documentation>
		      </xs:annotation>
		      <xs:complexType>
			<xs:sequence>
			  <xs:element name="event" type="xs:string">
			    <xs:annotation>
			      <xs:documentation>
				The name of the event.
			      </xs:documentation>
			    </xs:annotation>
			  </xs:element>
			  <xs:element name="site" type="xs:string">
			    <xs:annotation>
			      <xs:documentation>
				The name of the site.
			      </xs:documentation>
			    </xs:annotation>
			  </xs:element>
			</xs:sequence>
		      </xs:complexType>
		    </xs:element>
		    <xs:element ref="date" minOccurs="1" maxOccurs="1"/>
		    <xs:element name="opponents">
		      <xs:annotation>
			<xs:documentation>
			  The two sides of a chess game.
			</xs:documentation>
		      </xs:annotation>
		      <xs:complexType>
			<xs:sequence>
			  <xs:element name="white">
			    <xs:annotation>
			      <xs:documentation>
				The white side of a game.
			      </xs:documentation>
			    </xs:annotation>
			    <xs:complexType>
			      <xs:sequence>
				<xs:element ref="player" maxOccurs="unbounded"/>
			      </xs:sequence>
			    </xs:complexType>
			  </xs:element>
			  <xs:element name="black">
			    <xs:annotation>
			      <xs:documentation>
				The black side of a game.
			      </xs:documentation>
			    </xs:annotation>
			    <xs:complexType>
			      <xs:sequence>
				<xs:element ref="player" maxOccurs="unbounded"/>
			      </xs:sequence>
			    </xs:complexType>
			  </xs:element>
			</xs:sequence>
		      </xs:complexType>
		    </xs:element>
		    <xs:element name="result">
		      <xs:annotation>
			<xs:documentation>
			  The result of a game.
			</xs:documentation>
		      </xs:annotation>
		      <xs:complexType>
			<xs:attribute name="res" type="xs:string">
			  <xs:annotation>
			    <xs:documentation>
			      The result which can be one of strings
			      1-0, 0-1, draw, unknown or noresult.
			    </xs:documentation>
			  </xs:annotation>
			</xs:attribute>
			<xs:attribute name="why" type="xs:string">
			  <xs:annotation>
			    <xs:documentation>
			      The reason for result which can be of 
			      the strings resigned, agreed, mate, 
			      stalemate, time, rules, adjudication, 
			      bye, emergency, death, forfeit, withdrawn, 
			      abandoned, notyetplayed, notyetfinished or
			      reasonUnknown.
			    </xs:documentation>
			  </xs:annotation>
			</xs:attribute>
		      </xs:complexType>
		    </xs:element>
		    <xs:element name="opening">
		      <xs:annotation>
			<xs:documentation>
			  The opening classification.
			</xs:documentation>
		      </xs:annotation>
		      <xs:complexType>
			<xs:sequence>
			  <xs:element name="nic">
			    <xs:annotation>
			      <xs:documentation>
				The New in Chess classification.
			      </xs:documentation>
			    </xs:annotation>
			  </xs:element>
			  <xs:element name="eco">
			    <xs:annotation>
			      <xs:documentation>
				The ECO classification.
			      </xs:documentation>
			    </xs:annotation>
			  </xs:element>
			  <xs:element name="name">
			    <xs:annotation>
			      <xs:documentation>
				The name of the opening.
			      </xs:documentation>
			    </xs:annotation>
			    <xs:complexType>
			      <xs:simpleContent>
				<xs:extension base="xs:string">
				  <xs:attribute name="lang" type="xs:string">
				    <xs:annotation>
				      <xs:documentation>
					The language of the name. Valid 
					values include fi, fi_FI, en.
				      </xs:documentation>
				    </xs:annotation>
				  </xs:attribute>
				</xs:extension>
			      </xs:simpleContent>
			    </xs:complexType>
			  </xs:element>
			</xs:sequence>
		      </xs:complexType>
		    </xs:element>
		  </xs:sequence>
		  <xs:attribute name="round-nr" type="xs:integer"/>
		</xs:complexType>
	      </xs:element>
	      <xs:element name="moves">
		<xs:annotation>
		  <xs:documentation>
		    The moves of the game.
		  </xs:documentation>
		</xs:annotation>
		<xs:complexType>
		  <xs:sequence>
		    <xs:element name="mp" maxOccurs="unbounded">
		      <xs:annotation>
			<xs:documentation>
			  The container for a half move pair or for 
			  a single move in the end of the game.
			</xs:documentation>
		      </xs:annotation>
		      <xs:complexType>
			<xs:sequence>
			  <xs:element ref="m" maxOccurs="2"/>
			</xs:sequence>
		      </xs:complexType>
		    </xs:element>
		  </xs:sequence>
		  <xs:attribute name="ply-count" type="xs:integer">
		    <xs:annotation>
		      <xs:documentation>
			The number of half moves.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:attribute>
		</xs:complexType>
	      </xs:element>
	    </xs:sequence>
	  </xs:complexType>
	</xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

