<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:rad="http://cbikt.de/rad-framework/page"
  targetNamespace="http://cbikt.de/rad-framework/page"
  elementFormDefault="qualified">
  <!-- ROOT ELEMENT -->
  <xsd:element name="page">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="model" minOccurs="0" type="rad:ModelType">
          <!-- ensure uniqueness among top-level query and record names -->
          <xsd:unique name="UniqueQueryAndRecordNames">
            <xsd:selector xpath="rad:query|rad:emptyset|rad:record" />
            <xsd:field xpath="@name" />
          </xsd:unique>
          <!-- ensure that each record refers to an existing top-level query -->
          <xsd:key name="QueryName">
            <xsd:selector xpath="rad:query|rad:emptyset" />
            <xsd:field xpath="@name" />
          </xsd:key>
          <xsd:keyref name="RecordQueryName" refer="rad:QueryName">
            <xsd:selector xpath="rad:record|rad:primary" />
            <xsd:field xpath="@query" />
          </xsd:keyref>
        </xsd:element>

        <xsd:choice minOccurs="0" maxOccurs="1">
          <xsd:element name="body" type="rad:ContentType">
            <xsd:unique name="UniqueWidgetIds">
              <xsd:selector xpath=".//rad:*" />
              <xsd:field xpath="@id" />
            </xsd:unique>
          </xsd:element>
          <xsd:element name="scripted-body">
            <xsd:complexType>
              <xsd:attribute name="callback-data" type="rad:Callback" />
              <xsd:attribute name="callback-render" type="rad:Callback" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:sequence>
      <xsd:attribute name="title" type="xsd:string" use="required" />
      <xsd:attribute name="title-new" type="xsd:string" />
      <xsd:attribute name="title-breadcrumb" type="xsd:string" />
      <xsd:attribute name="requires-arguments" type="rad:Boolean" default="no" />
      <xsd:attribute name="layout" type="xsd:string" />
      <xsd:attribute name="unsaved-notice" type="rad:Boolean" />
      <xsd:attribute name="onpreparerecords" type="rad:Callback" />
      <xsd:attribute name="onbeforerun" type="rad:Callback" />
      <xsd:attribute name="onbeforerender" type="rad:Callback" />
      <xsd:attribute name="show-in-menu" type="rad:Boolean" default="yes" />
      <xsd:attribute name="menu-icon" type="xsd:string" />
      <xsd:attribute name="menu-icon-color" type="xsd:string" />
      <xsd:attribute name="menu-max-depth" type="xsd:integer" />
      <xsd:attribute name="menu-weight" type="xsd:float" default="0" />
      <xsd:attribute name="menu-new-window" type="rad:Boolean" default="no" />
    </xsd:complexType>
  </xsd:element>

  <!-- DEFINITION OF THE 'MODEL' TAG -->
  <xsd:complexType name="ModelType">
    <xsd:sequence>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="query" type="rad:QueryType">
          <!-- ensure uniqueness among first-level subquery names -->
          <xsd:unique name="UniqueFirstLevelSubqueryNames">
            <xsd:selector xpath="rad:subquery" />
            <xsd:field xpath="@name" />
          </xsd:unique>
        </xsd:element>
        <xsd:element ref="rad:emptyset" />
        <xsd:element name="primary" type="rad:PrimaryType" />
      </xsd:choice>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="subquery">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="sql" type="xsd:string" />
        <xsd:group ref="rad:BindsGroup" />
        <xsd:element ref="rad:subquery" minOccurs="0" maxOccurs="unbounded" />
      </xsd:sequence>
      <xsd:attribute name="name" type="rad:ModelName" use="required" />
    </xsd:complexType>
    <!-- ensure uniqueness among binds -->
    <xsd:unique name="UniqueBindChildFields">
      <xsd:selector xpath="rad:bind" />
      <xsd:field xpath="@child" />
    </xsd:unique>
    <!-- ensure uniqueness among recursive subquery names -->
    <xsd:unique name="UniqueSubqueryNames">
      <xsd:selector xpath="rad:subquery" />
      <xsd:field xpath="@name" />
    </xsd:unique>
  </xsd:element>

  <xsd:complexType name="QueryType">
    <xsd:sequence>
      <xsd:element name="sql" type="xsd:string" />
      <xsd:group ref="rad:ArgsGroup" />
      <xsd:element ref="rad:subquery" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="name" type="rad:ModelName" use="required" />
    <xsd:attribute name="required" type="rad:Boolean" default="yes" />
  </xsd:complexType>

  <xsd:element name="emptyset">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="rad:emptyset" minOccurs="0" maxOccurs="unbounded" />
      </xsd:sequence>
      <xsd:attribute name="name" type="rad:ModelName" use="required" />
    </xsd:complexType>
    <xsd:unique name="UniqueSubEmptySetNames">
      <xsd:selector xpath="rad:emptyset" />
      <xsd:field xpath="@name" />
    </xsd:unique>
  </xsd:element>

  <xsd:complexType name="PrimaryType">
    <xsd:attribute name="query" type="rad:ModelName" use="required" />
    <xsd:attribute name="field" type="xsd:string" use="optional" />
    <xsd:attribute name="allow-add" type="rad:BooleanOrOnly" default="no" />
  </xsd:complexType>

  <xsd:group name="ArgsGroup">
    <xsd:sequence>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="foreign">
          <xsd:complexType>
            <xsd:attribute name="field" type="xsd:string" use="required" />
            <xsd:attribute name="to-record" type="xsd:string" use="required" />
            <xsd:attribute name="to-field" type="xsd:string" use="required" />
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="var">
          <xsd:complexType>
            <xsd:attribute name="name" type="xsd:string" use="required" />
            <xsd:attribute name="field" type="xsd:string" use="required" />
            <xsd:attribute name="required" type="rad:Boolean" default="yes" />
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="urlparam">
          <xsd:complexType>
            <xsd:attribute name="field" type="xsd:string" use="required" />
            <xsd:attribute name="name" type="xsd:string" use="required" />
            <xsd:attribute name="required" type="rad:Boolean" default="yes" />
          </xsd:complexType>
        </xsd:element>
      </xsd:choice>
    </xsd:sequence>
  </xsd:group>

  <xsd:group name="BindsGroup">
    <xsd:sequence>
      <xsd:element name="bind" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:attribute name="parent" type="xsd:string" use="required" />
          <xsd:attribute name="child" type="xsd:string" use="required" />
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:group>


  <!-- WIDGETS -->
  <!-- attributes of the Widget base class -->
  <xsd:attributeGroup name="WidgetAttribs">
    <xsd:attribute name="id" type="rad:WidgetName" />
    <xsd:attribute name="name" type="rad:WidgetName" />
    <xsd:attribute name="hidden" type="rad:Boolean" />
    <xsd:attribute name="fix-record" type="rad:Boolean" />
    <xsd:attribute name="editable" type="rad:BooleanOrNew" />
    <xsd:attribute name="class" type="xsd:string" />
    <xsd:attribute name="style" type="xsd:string" />
    <xsd:attribute name="inline" type="rad:Boolean" default="yes" />
  </xsd:attributeGroup>

  <!-- attributes and elements of the CompositeWidget base class -->
  <xsd:attributeGroup name="CompositeAttribs">
    <xsd:attribute name="caption" type="xsd:string" />
    <xsd:attribute name="outer-class" type="xsd:string" />
    <xsd:attribute name="help" type="xsd:string" />
  </xsd:attributeGroup>
  <xsd:group name="CompositeGroup">
    <xsd:sequence>
      <xsd:element name="action" minOccurs="0" maxOccurs="unbounded"
        type="rad:ContentType" />
    </xsd:sequence>
  </xsd:group>

  <!-- attributes of the ValueWidget base type -->
  <xsd:attributeGroup name="ValueWidgetAttribs">
    <xsd:attributeGroup ref="rad:WidgetAttribs" />
    <xsd:attribute name="source" type="xsd:string" use="optional"/>
  </xsd:attributeGroup>

  <!-- select widget -->
  <xsd:element name="select" type="rad:SelectWidgetType" />
  <xsd:complexType name="SelectWidgetType">
    <xsd:sequence>
      <xsd:element name="option" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:simpleContent>
            <xsd:extension base="xsd:string">
              <xsd:attribute name="value" type="xsd:string" use="required" />
            </xsd:extension>
          </xsd:simpleContent>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
    <xsd:attribute name="sql" type="xsd:string" />
    <xsd:attribute name="allow-null" type="rad:Boolean" />
    <xsd:attribute name="null-label" type="xsd:string" />
    <xsd:attribute name="allow-new" type="rad:Boolean" />
    <xsd:attribute name="new-label" type="xsd:string" />
    <xsd:attribute name="null-display" type="xsd:string" />
    <xsd:attribute name="ajax-url" type="xsd:string" />
  </xsd:complexType>

  <!-- enum widget -->
  <xsd:element name="enum">
    <xsd:complexType>
      <xsd:complexContent>
        <xsd:restriction base="rad:SelectWidgetType">
          <xsd:attribute name="sql" use="prohibited" />
        </xsd:restriction>
      </xsd:complexContent>
    </xsd:complexType>
  </xsd:element>

  <!-- table widget -->
  <xsd:element name="table">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:group ref="rad:CompositeGroup" />
        <xsd:element name="td" maxOccurs="unbounded"
          type="rad:TableWidgetColumn" />
        <xsd:element name="action-column" minOccurs="0" maxOccurs="unbounded"
          type="rad:ContentType" />
        <xsd:element name="editing-area" minOccurs="0" type="rad:ContentType" />
      </xsd:sequence>
      <xsd:attributeGroup ref="rad:WidgetAttribs" />
      <xsd:attributeGroup ref="rad:CompositeAttribs" />
      <xsd:attribute name="source" type="rad:SourcePath" use="required" />
      <xsd:attribute name="allow-select" type="rad:Boolean" default="yes" />
      <xsd:attribute name="allow-add" type="rad:Boolean" default="no" />
      <xsd:attribute name="custom-add-link" type="xsd:string" />
      <xsd:attribute name="custom-select-link" type="xsd:string" />
      <xsd:attribute name="allow-delete" type="rad:Boolean" />
      <xsd:attribute name="page-size" type="xsd:nonNegativeInteger" />
      <xsd:attribute name="auto-filter" type="rad:Boolean" />
      <xsd:attribute name="sortable" type="rad:Boolean" />
      <xsd:attribute name="onnewrecord" type="rad:Callback" />
      <xsd:attribute name="onrecordsaved" type="rad:Callback" />
      <xsd:attribute name="onrenderrow" type="rad:Callback" />
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="TableWidgetColumn">
    <xsd:complexContent>
      <xsd:extension base="rad:ContentType">
        <xsd:attribute name="title" type="xsd:string" use="required" />
        <xsd:attribute name="width">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:pattern value="([1-9][0-9]*)|\*" />
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
        <xsd:attribute name="style" type="xsd:string" />
        <xsd:attribute name="class" type="xsd:string" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- repeat widget -->
  <xsd:element name="repeat">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="content" minOccurs="1" maxOccurs="1"
          type="rad:ContentType" />
        <xsd:element name="not-found" minOccurs="0" maxOccurs="1"
          type="rad:ContentType" />
      </xsd:sequence>
      <xsd:attributeGroup ref="rad:WidgetAttribs" />
      <xsd:attribute name="source" type="rad:SourcePath" />
      <xsd:attribute name="separator" type="xsd:string" />
      <xsd:attribute name="onrenderrow" type="rad:Callback" />
      <xsd:attribute name="onrendernotfound" type="rad:Callback" />
    </xsd:complexType>
  </xsd:element>

  <!-- group widget -->
  <xsd:element name="group" type="rad:GroupType" />
  <xsd:complexType name="GroupType" mixed="true">
    <xsd:sequence>
      <xsd:group ref="rad:CompositeGroup" />
      <xsd:group ref="rad:ContentGroup" />
    </xsd:sequence>
    <xsd:attributeGroup ref="rad:WidgetAttribs" />
    <xsd:attributeGroup ref="rad:CompositeAttribs" />
    <xsd:attribute name="table-new-required" type="xsd:string" />
    <xsd:attribute name="source" type="rad:SourcePath" />
    <xsd:attribute name="onrender" type="rad:Callback" />
  </xsd:complexType>

  <!-- single-form widget -->
  <xsd:element name="single-form">
    <xsd:complexType>
      <xsd:complexContent>
        <xsd:extension base="rad:GroupType">
          <xsd:attribute name="onsubmit" type="rad:Callback" />
          <xsd:attribute name="onvalidate" type="rad:Callback" />
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
  </xsd:element>

  <!-- switch widget -->
  <xsd:element name="switch">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="case" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:complexContent>
              <xsd:extension base="rad:ContentType">
                <xsd:attribute name="value" type="xsd:string" use="required" />
              </xsd:extension>
            </xsd:complexContent>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="default" minOccurs="0" maxOccurs="1"
          type="rad:ContentType" />
      </xsd:sequence>
      <xsd:attributeGroup ref="rad:WidgetAttribs" />
      <xsd:attribute name="source" type="xsd:string" use="required"/>
    </xsd:complexType>
  </xsd:element>

  <!-- tabs widget -->
  <xsd:element name="tabs">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="tab" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:complexContent>
              <xsd:extension base="rad:ContentType">
                <xsd:attribute name="title" type="xsd:string" use="required" />
                <xsd:attribute name="first" type="rad:Boolean" />
                <xsd:attribute name="icon" type="xsd:string" />
              </xsd:extension>
            </xsd:complexContent>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
      <xsd:attributeGroup ref="rad:WidgetAttribs" />
      <xsd:attribute name="use-url" type="rad:Boolean" />
    </xsd:complexType>
  </xsd:element>

  <!-- wizard widget -->
  <xsd:element name="wizard">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="pane" minOccurs="1" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:complexContent>
              <xsd:extension base="rad:ContentType">
                <xsd:attribute name="title" type="xsd:string" use="required" />
                <xsd:attribute name="subtitle" type="xsd:string" />
              </xsd:extension>
            </xsd:complexContent>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
      <xsd:attributeGroup ref="rad:WidgetAttribs" />
      <xsd:attribute name="source" type="rad:SourcePath" />
      <xsd:attribute name="onchange" type="rad:Callback" />
      <xsd:attribute name="onfinish" type="rad:Callback" />
    </xsd:complexType>
  </xsd:element>

  <!-- text widget -->
  <xsd:element name="text">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
      <xsd:attribute name="placeholder" type="xsd:string" />
      <xsd:attribute name="truncate" type="xsd:nonNegativeInteger" />
    </xsd:complexType>
  </xsd:element>

  <!-- html widget -->
  <xsd:element name="HTML">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
      <xsd:attribute name="placeholder" type="xsd:string" />
      <xsd:attribute name="truncate" type="xsd:nonNegativeInteger" />
    </xsd:complexType>
  </xsd:element>

  <!-- currency widget -->
  <xsd:element name="currency">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
      <xsd:attribute name="placeholder" type="xsd:string" />
    </xsd:complexType>
  </xsd:element>

  <!-- textarea widget -->
  <xsd:element name="textarea">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
      <xsd:attribute name="placeholder" type="xsd:string" />
      <xsd:attribute name="rows" type="xsd:nonNegativeInteger" />
      <xsd:attribute name="cols" type="xsd:nonNegativeInteger" />
      <xsd:attribute name="truncate" type="xsd:nonNegativeInteger" />
    </xsd:complexType>
  </xsd:element>

  <!-- color widget -->
  <xsd:element name="color">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
    </xsd:complexType>
  </xsd:element>

  <!-- password widget -->
  <xsd:element name="password">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
      <xsd:attribute name="show-string" type="xsd:string" />
    </xsd:complexType>
  </xsd:element>

  <!-- date widget -->
  <xsd:element name="date">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
      <xsd:attribute name="format" type="xsd:string" />
    </xsd:complexType>
  </xsd:element>

  <!-- checkbox widget -->
  <xsd:element name="checkbox">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
      <xsd:attribute name="label" type="xsd:string" />
    </xsd:complexType>
  </xsd:element>

  <!-- link widget -->
  <xsd:element name="link">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attributeGroup ref="rad:WidgetAttribs" />
          <xsd:attribute name="href" type="xsd:string" use="required"/>
          <xsd:attribute name="target" type="xsd:string" />
          <xsd:attribute name="icon" type="xsd:string" />
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>

  <!-- linkconfirm widget -->
  <xsd:element name="linkconfirm">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attributeGroup ref="rad:WidgetAttribs" />
          <xsd:attribute name="href" type="xsd:string" use="required"/>
          <xsd:attribute name="target" type="xsd:string" />
          <xsd:attribute name="icon" type="xsd:string" />
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>

  <!-- button widget -->
  <xsd:element name="button">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attributeGroup ref="rad:WidgetAttribs" />
          <xsd:attribute name="icon" type="xsd:string" />
          <xsd:attribute name="onclick" type="rad:Callback" />
          <xsd:attribute name="requires-write" type="rad:Boolean" default="yes" />
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>

  <!-- file widget -->
  <xsd:element name="file">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
    </xsd:complexType>
  </xsd:element>

  <!-- picture widget -->
  <xsd:element name="picture">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
      <xsd:attribute name="width" type="xsd:nonNegativeInteger" />
      <xsd:attribute name="height" type="xsd:nonNegativeInteger" />
      <xsd:attribute name="resize" type="rad:Boolean" />
      <xsd:attribute name="thumbnail" type="rad:Boolean" />
      <xsd:attribute name="fitwidth" type="rad:Boolean" />
      <xsd:attribute name="fitheight" type="rad:Boolean" />
      <xsd:attribute name="fitbest" type="rad:Boolean" />
      <xsd:attribute name="link" type="rad:Boolean" />
      <xsd:attribute name="cropper" type="rad:Boolean" />
    </xsd:complexType>
  </xsd:element>

  <!-- picture-svg widget -->
  <xsd:element name="picture-svg">
    <xsd:complexType>
      <xsd:attributeGroup ref="rad:ValueWidgetAttribs" />
      <xsd:attribute name="width" type="xsd:nonNegativeInteger" />
      <xsd:attribute name="height" type="xsd:nonNegativeInteger" />
      <xsd:attribute name="link" type="rad:Boolean" />
    </xsd:complexType>
  </xsd:element>

  <!-- sql-group widget -->
  <xsd:element name="sql-group">
    <xsd:complexType mixed="true">
      <xsd:sequence>
        <xsd:group ref="rad:CompositeGroup" />
        <xsd:group ref="rad:ContentGroup" />
      </xsd:sequence>
      <xsd:attributeGroup ref="rad:WidgetAttribs" />
      <xsd:attributeGroup ref="rad:CompositeAttribs" />
      <xsd:attribute name="sql" type="xsd:string" use="required" />
    </xsd:complexType>
  </xsd:element>

  <!-- SPECIAL ELEMENT 'attribute' -->
  <xsd:element name="attribute">
    <xsd:complexType>
      <xsd:attribute name="name" type="xsd:string" use="required" />
      <xsd:attribute name="function" type="xsd:string" use="required" />
    </xsd:complexType>
  </xsd:element>

  <!-- MIXED HTML/RAD CONTENT -->
  <xsd:group name="ContentGroup">
    <xsd:sequence>
      <xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##any"
        processContents="lax" />
    </xsd:sequence>
  </xsd:group>
  <xsd:complexType name="ContentType" mixed="true">
    <xsd:sequence>
      <xsd:group ref="rad:ContentGroup" />
    </xsd:sequence>
  </xsd:complexType>

  <!-- COMMON ATTRIBUTE VALUE TYPES -->
  <xsd:simpleType name="Boolean">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="yes" />
      <xsd:enumeration value="no" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="BooleanOrNew">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="yes" />
      <xsd:enumeration value="no" />
      <xsd:enumeration value="new" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="BooleanOrOnly">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="yes" />
      <xsd:enumeration value="no" />
      <xsd:enumeration value="only" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="WidgetName">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="[A-Za-z0-9][A-Za-z0-9_-]*" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="ModelName">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="[A-Za-z0-9_-]+" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="SourcePath">
    <xsd:restriction base="xsd:string">
      <xsd:minLength value="1" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="Callback">
    <xsd:restriction base="xsd:string" />
  </xsd:simpleType>
</xsd:schema>
