﻿<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Entries"
    targetNamespace="http://smath.info/studio/entries"
    elementFormDefault="qualified"
    xmlns="http://smath.info/studio/entries"
    xmlns:mstns="http://smath.info/studio/entries"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

  <xs:simpleType name="NonEmptyString">
    <xs:restriction base="xs:string">
      <xs:pattern value="^(?!\s*$).+" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="NumericEquation">
    <xs:restriction base="xs:string">
      <xs:pattern value="^[0-9\.πei/\-\*\^]+" />
    </xs:restriction>
  </xs:simpleType>

  <xs:attribute name="default" />
  <xs:attribute name="rus" />
  <xs:attribute name="bul" />
  <xs:attribute name="chs" />
  <xs:attribute name="cht" />
  <xs:attribute name="cpp" />
  <xs:attribute name="cze" />
  <xs:attribute name="dan" />
  <xs:attribute name="dut" />
  <xs:attribute name="fre" />
  <xs:attribute name="ger" />
  <xs:attribute name="hun" />
  <xs:attribute name="ind" />
  <xs:attribute name="ita" />
  <xs:attribute name="lth" />
  <xs:attribute name="pol" />
  <xs:attribute name="por" />
  <xs:attribute name="scc" />
  <xs:attribute name="scr" />
  <xs:attribute name="spa" />
  <xs:attribute name="tur" />
  <xs:attribute name="ukr" />
  <xs:attribute name="gre" />
  <xs:attribute name="srp" />
  <xs:attribute name="ron" />
  <xs:attribute name="bel" />
  <xs:attribute name="isl" />
  <xs:attribute name="cat" />
  <xs:attribute name="kor" />
  <xs:attribute name="lav" />
  <xs:attribute name="nor" />
  <xs:attribute name="slk" />
  <xs:attribute name="slv" />
  <xs:attribute name="tha" />
  <xs:attribute name="fin" />
  <xs:attribute name="swe" />
  <xs:attribute name="jpn" />
  <xs:attribute name="heb" />
  <xs:attribute name="ara" />
  <xs:attribute name="fas" />

  <xs:simpleType name="system-of-measurement">
    <xs:list>
      <xs:simpleType>
        <xs:restriction base="NonEmptyString">
          <xs:enumeration value="All" />
          <xs:enumeration value="Metric" />
          <xs:enumeration value="Imperial" />
        </xs:restriction>
      </xs:simpleType>
    </xs:list>
  </xs:simpleType>

  <xs:simpleType name="prefix-of-unit">
    <xs:list>
      <xs:simpleType>
        <xs:restriction base="xs:Name">
          <xs:enumeration value="p" />
          <xs:enumeration value="n" />
          <xs:enumeration value="μ" />
          <xs:enumeration value="m" />
          <xs:enumeration value="c" />
          <xs:enumeration value="d" />
          <xs:enumeration value="da" />
          <xs:enumeration value="h" />
          <xs:enumeration value="k" />
          <xs:enumeration value="M" />
          <xs:enumeration value="G" />
          <xs:enumeration value="T" />
          <xs:enumeration value="pico" />
          <xs:enumeration value="nano" />
          <xs:enumeration value="micro" />
          <xs:enumeration value="milli" />
          <xs:enumeration value="centi" />
          <xs:enumeration value="deci" />
          <xs:enumeration value="deka" />
          <xs:enumeration value="hecto" />
          <xs:enumeration value="kilo" />
          <xs:enumeration value="mega" />
          <xs:enumeration value="giga" />
          <xs:enumeration value="tera" />
          <xs:enumeration value="ki" />
          <xs:enumeration value="Mi" />
          <xs:enumeration value="Gi" />
          <xs:enumeration value="Ti" />
          <xs:enumeration value="kibi" />
          <xs:enumeration value="mebi" />
          <xs:enumeration value="gibi" />
          <xs:enumeration value="tebi" />
        </xs:restriction>
      </xs:simpleType>
    </xs:list>
  </xs:simpleType>

  <xs:simpleType name="factor-of-unit">
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="1">
            <xs:annotation>
              <xs:documentation>Unit will be used as base unit for the whole dimnsion.</xs:documentation>
            </xs:annotation>
          </xs:enumeration>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:pattern value=".{1,}" />
        </xs:restriction>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>

  <xs:complexType name="add-prefix">
    <xs:attribute name="name" type="prefix-of-unit" use="required" />
    <xs:attribute name="factor" type="NumericEquation" use="required" />
    <xs:attribute name="exp" type="xs:integer" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="prefixes">
    <xs:sequence maxOccurs="unbounded">
      <xs:element name="add" type="add-prefix" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="add-dimension">
    <xs:attribute name="baseunit" type="NonEmptyString" use="optional" />
    <xs:attribute name="connection" type="NonEmptyString" use="optional" />
    <xs:attribute name="id" type="xs:positiveInteger" use="optional" />
  </xs:complexType>

  <xs:complexType name="dimensions">
    <xs:sequence maxOccurs="unbounded">
      <xs:element name="add" type="add-dimension" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="synonym">
    <xs:attribute name="name" type="NonEmptyString" use="required" />
    <xs:attribute name="prefix" type="prefix-of-unit" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="prefix-extension">
    <xs:attribute name="name" type="prefix-of-unit" use="required" />
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="id" type="xs:positiveInteger" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="exclude-extension">
    <xs:attribute name="name" type="NonEmptyString" use="required" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="extension">
    <xs:sequence minOccurs="1" maxOccurs="unbounded">
      <xs:element name="prefix" type="prefix-extension" minOccurs="0" />
      <xs:element name="exclude" type="exclude-extension" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="for" type="NonEmptyString" use="required" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="units">
    <xs:sequence maxOccurs="unbounded">
      <xs:choice>
        <xs:element name="property" type="property-unit" maxOccurs="unbounded" />
        <xs:element name="add" type="unit-alone" maxOccurs="unbounded" />
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="dimension" type="xs:integer" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="property-unit">
    <xs:sequence maxOccurs="unbounded">
      <xs:choice>
        <xs:element name="add" type="unit" maxOccurs="unbounded" />
        <xs:element name="override" type="override" minOccurs="0" maxOccurs="unbounded" />
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="dimension" type="xs:integer" use="optional" />
    <xs:attribute name="id" type="xs:integer" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="constants">
    <xs:sequence maxOccurs="unbounded">
      <xs:choice>
        <xs:element name="property" type="property-constant" maxOccurs="unbounded" />
        <xs:element name="add" type="constant-alone" maxOccurs="unbounded" />
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="dimension" type="xs:integer" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="property-constant">
    <xs:sequence maxOccurs="unbounded">
      <xs:element name="add" type="constant" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="dimension" type="xs:integer" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="compoundunits">
    <xs:sequence maxOccurs="unbounded">
      <xs:choice>
        <xs:element name="property" type="property-compoundunit" maxOccurs="unbounded" />
        <xs:element name="add" type="compoundunit" maxOccurs="unbounded" />
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="dimension" type="xs:integer" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="property-compoundunit">
    <xs:sequence maxOccurs="unbounded">
      <xs:element name="add" type="compoundunit" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="dimension" type="xs:positiveInteger" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="unit">
    <xs:sequence maxOccurs="unbounded">
      <xs:element name="synonym" type="synonym" minOccurs="1" maxOccurs="unbounded" />
      <xs:element name="extension" type="extension" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="id" type="xs:positiveInteger" use="optional" />
    <xs:attribute name="system" type="system-of-measurement" use="required" />
    <xs:attribute name="factor" type="NumericEquation" use="required" />
    <xs:attribute name="offset" type="NonEmptyString" use="optional" />
    <xs:attribute name="exp" type="xs:integer" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="unit-alone">
    <xs:complexContent>
      <xs:extension base="unit">
        <xs:attribute name="baseunit" type="NonEmptyString" use="optional" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="compoundunit">
    <xs:attribute name="value" type="NonEmptyString" use="required" />
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="system" type="system-of-measurement" use="required" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="constant">
    <xs:sequence maxOccurs="unbounded">
      <xs:element name="synonym" type="synonym" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="id" type="xs:integer" use="required" />
    <xs:attribute name="factor" type="NumericEquation" use="required" />
    <xs:attribute name="exp" type="xs:integer" use="optional" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:complexType name="constant-alone">
    <xs:complexContent>
      <xs:extension base="constant">
        <xs:attribute name="connection" type="NonEmptyString" use="optional" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="override">
    <xs:sequence maxOccurs="unbounded">
      <xs:element name="synonym" type="synonym" minOccurs="1" maxOccurs="unbounded" />
      <xs:element name="extension" type="extension" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="title" type="NonEmptyString" use="optional" />
    <xs:attribute name="id" type="xs:integer" use="optional" />
    <xs:attribute name="name" type="NonEmptyString" use="required" />
    <xs:anyAttribute namespace="http://smath.info/studio/entries" />
  </xs:complexType>

  <xs:element name="entries">
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:element name="prefixes" type="prefixes" minOccurs="0" maxOccurs="1" />
        <xs:element name="dimensions" type="dimensions" minOccurs="0" maxOccurs="1" />
        <xs:choice>
          <xs:element name="units" type="units" minOccurs="0" maxOccurs="unbounded" />
          <xs:element name="constants" type="constants" minOccurs="0" maxOccurs="unbounded" />
          <xs:element name="compoundunits" type="compoundunits" minOccurs="0" maxOccurs="unbounded" />
        </xs:choice>
      </xs:sequence>
      <xs:anyAttribute namespace="http://smath.info/studio/entries" />
    </xs:complexType>

    <xs:unique name="id-attr">
      <xs:selector xpath="dimension|unit|prefix" />
      <xs:field xpath="@id" />
    </xs:unique>

    <xs:unique name="name-attr">
      <xs:selector xpath="./units/prefixes/prefix" />
      <xs:field xpath="@name" />
    </xs:unique>
  </xs:element>

</xs:schema>
