<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="http://projets.admisource.gouv.fr/xemelios/technical/schemas/xsd2html.xsl"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:include schemaLocation="TListeResultat.xsd" />
  <xs:include schemaLocation="TPseudoXPath.xsd" />
  <xs:include schemaLocation="TRecherchePaire.xsd" />
  <xs:include schemaLocation="TOption.xsd" />
  <xs:include schemaLocation="TSpecialKeyEntry.xsd" />
  <xs:include schemaLocation="TProperty.xsd" />
  <xs:include schemaLocation="TResource.xsd"/>

    <xs:complexType name="TCritere">
      <xs:sequence>
        <xs:element name="path" minOccurs="0" maxOccurs="1" type="TPseudoXPath">
          <xs:annotation>
            <xs:documentation>
              L'expression XPath de la condition de ce critere. Une fois le pseudo-xpath transforme,
              il doit pouvoir etre concatene au chemin de l'element pour constituer un requete XPath valide.
              Si ce chemin n'est pas present, il est considere comme titre et ne joue
              plus comme conditions. Ce principe est utilise pour afficher le titre
              d'un plugin de recherche (par exemple) au dessus des criteres
            </xs:documentation>
          </xs:annotation>
        </xs:element>
        <xs:choice minOccurs="1" maxOccurs="1">
          <xs:element name="blank" minOccurs="0" maxOccurs="1" type="TEmpty">
            <xs:annotation>
              <xs:documentation>
                Dans le cas d'un critere n'ayant pas de valeur saisissable, pour qu'il
                ne soit pas considere comme un titre il faut ajouter un element &lt;blank/&gt;
              </xs:documentation>
            </xs:annotation>
          </xs:element>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="input" type="TInput"/>
            <xs:element name="select" type="TSelect"/>
          </xs:choice>
        </xs:choice>
        <xs:element name="property" type="TProperty" minOccurs="0" maxOccurs="unbounded"/>
        <!--xs:element name="champ-optionnel" minOccurs="0" maxOccurs="1" type="TChamp" /-->
      </xs:sequence>
      <xs:attribute name="id" use="required" type="xs:NCName"/>
      <xs:attribute name="libelle" use="required"/>
      <xs:attribute name="optional-display-id" use="optional">
        <xs:annotation><xs:documentation>Permet de spécifier un champ optionnel. Si l'attribut n'est pas fournit, il n'y a pas de champ optionnel. Si il est fournit, c'est le champ désigné par l'attribut qui eest fournit en champ optionnel.</xs:documentation></xs:annotation>
      </xs:attribute>
      <xs:attribute name="mode" use="optional" default="both">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="normal"><xs:annotation><xs:documentation>display only in mode normal</xs:documentation></xs:annotation></xs:enumeration>
            <xs:enumeration value="anomaly"><xs:annotation><xs:documentation>display only in mode anomaly</xs:documentation></xs:annotation></xs:enumeration>
            <xs:enumeration value="both"><xs:annotation><xs:documentation>display in both modes. This is the default</xs:documentation></xs:annotation></xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="optional" use="optional" type="xs:boolean">
        <xs:annotation>
          <xs:documentation>Lorsqu'un critère est défini sous un plugin, il est possible de le qualifier comme optionnel. Cela permet de filtrer plus précisemment les recherches prédéfinies.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  
    <xs:complexType name="TCritereRef">
      <xs:annotation>
        <xs:documentation>Définition d'un critère dont la définition existe déjà. Utilisé notemment pour définir des critères optionnels dans les plugins.</xs:documentation>
      </xs:annotation>
      <xs:attribute name="id" type="xs:NCName"/>
      <xs:attribute name="id-ref" type="xs:NCName"/>
      <xs:attribute name="optional" type="xs:boolean"/>
    </xs:complexType>  
  
    <xs:complexType name="TEmpty"/>

    <xs:complexType name="TInput">
      <xs:annotation>
        <xs:documentation>
          Element de saisie represente par un champ
        </xs:documentation>
      </xs:annotation>
      <xs:attribute name="datatype" type="TInputDatatype">
        <xs:annotation>
          <xs:documentation>
            En definissnt un type de donnee, on fait apparaitre une liste de comparateurs possibles. 
            En general, pour les string, on a (Commence par, contient, egale, differe, etc...)
            et pour les numeriques on a (=, &lt;=, &lt;, !=, &gt;=, &gt;)
          </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="help" type="TPseudoXPath">
        <xs:annotation>
          <xs:documentation>
            Requete XPath valide ramenant une liste de valeurs que l'utilisateur pourra selectionner pour mettre comme valeur du champ
          </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="id" use="required" type="xs:NCName">
        <xs:annotation>
          <xs:documentation>
            Identifiant du champ. Cet identifiant est utilise pour faire des substitutions dans le path du critere avec ##VALEUR:id## et ##OPERATEUR:id##
          </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="libelle" type="xs:string">
        <xs:annotation>
          <xs:documentation>
            Permet d'afficher un libelle avant le champ. Non obligatoire.
          </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="uppercase" type="xs:boolean">
        <xs:annotation>
          <xs:documentation>
            Permet de forcer la saisie en majuscules
          </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="remove-operator" type="xs:boolean" use="optional" default="false">
        <xs:annotation>
          <xs:documentation>Permet d'indiquer qu'on ne veut pas afficher les opérateurs. Utiles simplement quand on est obligé de spécifier un datatype mais qu'on ne veut pas d'opérateur, pour les dates par exemple.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="xml-format" type="xs:string" use="optional">
        <xs:annotation><xs:documentation>cet attribut est obligatoire si l'attribut datatype vaut "date". Il décrit dans quel format la date est dans le fichier xml. Le format indiqué doit correspondre à la définition de java.text.SimpleDateFormat</xs:documentation></xs:annotation>
      </xs:attribute>
    </xs:complexType>
    
    <xs:simpleType name="TInputDatatype">
      <xs:restriction base="xs:string">
        <xs:enumeration value="string"/>
        <xs:enumeration value="numeric"/>
        <xs:enumeration value="date"/>
      </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="TSelect">
      <xs:annotation>
        <xs:documentation>
          Element de saisie represente par une liste de choix.
          Les elements contenus dans cette liste de choix sont des paires (code/libelle)
          issus de recherche dans la nomenclature, de valeurs de special-key ou d'options
          definies en dur.
          Le tri, si il est definit, intervient sur le contenu global du select
        </xs:documentation>
      </xs:annotation>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="recherche-paire" type="TRecherchePaire">
          <xs:annotation>
            <xs:documentation>
              
            </xs:documentation>
          </xs:annotation>
        </xs:element>
        <xs:element name="special-key-entry" type="TSpecialKeyEntry" maxOccurs="1"/>
        <xs:element name="option" maxOccurs="unbounded" type="TOption"/>
        <xs:element name="resource-ref" type="TResourceRef" maxOccurs="unbounded"/>
      </xs:choice>
      <xs:attribute name="id" use="required" type="xs:NCName"/>
      <xs:attribute name="libelle" type="xs:NCName"/>
      <xs:attribute name="sort" type="xs:NCName"/>
    </xs:complexType>

</xs:schema>
