XML schema

<[email protected]> Tue, 25 Mar 2003 12:34:34 +0000 (GMT)
Newsgroups gmane.text.xml.o-xml
Message-ID <[email protected]>
people - attached is a mostly complete XML Schema for the core language.
it should make source editing with a schema-aware editor (eg XML Spy) much
easier, with predictive typing, validation and all.

enjoy -

/m

Martin Klang
http://www.o-xml.org - the object-oriented XML programming language
lang.xsd (text/plain, 6.7 KB)
<?xml version='1.0' encoding='UTF-8' ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:tns="http://www.o-xml.org/lang/"
  targetNamespace="http://www.o-xml.org/lang/">

  <!-- eval -->
  <element name="eval" type="tns:Eval"/>
  <complexType name="Eval" >
    <attribute name="select" type="tns:Expression" use="required"/>
  </complexType>

  <!-- do -->
  <element name="do" type="tns:Do" />
  <complexType name="Do" mixed="true">
    <complexContent>
      <extension base="tns:Container" >
        <attribute name="select" type="tns:Expression" use="optional"/>
      </extension>
    </complexContent>
  </complexType>

  <!-- for-each -->
  <element name="for-each" type="tns:ForEach"/>
  <complexType name="ForEach" mixed="true">
    <complexContent>
      <extension base="tns:Container">
        <attributeGroup ref="tns:for-each-nodeset"/>
        <attributeGroup ref="tns:for-each-text"/>
        <attributeGroup ref="tns:for-each-numeric"/>
      </extension>
    </complexContent>
  </complexType>

  <attributeGroup name="for-each-nodeset">
    <attribute name="select" type="tns:Expression" use="optional"/>
  </attributeGroup>

  <attributeGroup name="for-each-text">
    <attribute name="in" type="tns:Expression" use="optional"/>
    <attribute name="delim" type="string" default=" " use="optional"/>
  </attributeGroup>

  <attributeGroup name="for-each-numeric">
    <attribute name="from" type="decimal" default="0" use="optional"/>
    <attribute name="to" type="decimal" use="optional"/>
    <attribute name="step" type="decimal" default="1" use="optional"/>
  </attributeGroup>

  <!-- program -->
  <element name="program" type="tns:Container"/>

  <!-- log -->
  <element name="log" type="tns:Log"/>
  <complexType name="Log" mixed="true">
    <complexContent>
      <extension base="tns:Container">
        <attribute name="msg" type="tns:Expression" use="optional"/>
      </extension>
    </complexContent>
  </complexType>

  <!-- return -->
  <element name="return" type="tns:Return"/>
  <complexType name="Return" mixed="true">
    <complexContent>
      <extension base="tns:Container">
        <attribute name="select" type="tns:Expression" use="optional"/>
      </extension>
    </complexContent>
  </complexType>

  <!-- param -->
  <element name="param" type="tns:Param"/>
  <complexType name="Param">
    <attribute name="name" type="tns:QName" use="required"/>
    <attribute name="type" type="tns:QName" use="optional" default="Node"/>
    <attribute name="select" type="tns:Expression" use="optional"/>
  </complexType>

  <!-- parent -->
  <element name="parent" type="tns:Parent"/>
  <complexType name="Parent">
    <attribute name="name" type="tns:QName" use="required"/>
    <attribute name="type" type="tns:QName" use="optional" default="Node"/>
    <attribute name="select" type="tns:Expression" use="optional"/>
  </complexType>

  <!-- procedure -->
  <element name="procedure" type="tns:Procedure"/>
  <complexType name="Procedure">
    <sequence>
      <element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="tns:do" minOccurs="1" maxOccurs="1"/>
    </sequence>
    <attribute name="name" type="tns:QName" use="required"/>
  </complexType>

  <!-- function -->
  <element name="function" type="tns:Function"/>
  <complexType name="Function">
    <sequence>
      <element ref="tns:param" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="tns:parent" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="tns:do" minOccurs="1" maxOccurs="1"/>
    </sequence>
    <attribute name="name" type="tns:QName" use="required"/>
  </complexType>

  <!-- type -->
  <element name="type" type="tns:Type"/>
  <complexType name="Type">
    <sequence>
      <element ref="tns:parent" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="tns:variable" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="tns:function" minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="name" type="tns:QName" use="required"/>
  </complexType>

  <!-- variable -->
  <element name="variable" type="tns:Variable"/>
  <complexType name="Variable" mixed="true">
    <complexContent>
      <extension base="tns:Container">
        <attribute name="name" type="tns:QName" use="required"/>
        <attribute name="select" type="tns:Expression" use="optional"/>
      </extension>
    </complexContent>
  </complexType>

  <!-- set -->
  <element name="set" type="tns:Set"/>
  <complexType name="Set">
    <anyAttribute namespace="##any" processContents="skip"/>
  </complexType>

  <!-- if -->
  <element name="if" type="tns:SimpleConditional"/>

  <!-- while -->
  <element name="while" type="tns:SimpleConditional"/>

  <complexType name="SimpleConditional" mixed="true">
    <complexContent>
      <extension base="tns:Container">
        <attribute name="test" type="tns:Expression" use="required"/>
      </extension>
    </complexContent>
  </complexType>

  <!-- choose -->
  <element name="choose" type="tns:Choose"/>
  <complexType name="Choose">
    <sequence>
      <element ref="tns:when" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="tns:otherwise" minOccurs="0" maxOccurs="1"/>
    </sequence>
  </complexType>
  <element name="when" type="tns:SimpleConditional"/>
  <element name="otherwise" type="tns:Container"/>

  <group name="top-level-elements">
    <choice>
      <!-- conditionals -->
      <element ref="tns:choose"/>
      <element ref="tns:if"/>
      <element ref="tns:while"/>

      <!-- control statements -->
      <element ref="tns:for-each"/>
      <element ref="tns:return"/>
      
      <!-- simples -->
      <element ref="tns:variable"/>
      <element ref="tns:set"/>
      <element ref="tns:log"/>
      <element ref="tns:eval"/>
      <element ref="tns:do"/>

      <!-- definitions -->
      <element ref="tns:function"/>
      <element ref="tns:procedure"/>
      <element ref="tns:type"/>
    </choice>
  </group>

  <!-- general-purpose container type -->
  <complexType name="Container" mixed="true">
    <sequence>
      <choice minOccurs="0" maxOccurs="unbounded">
        <any namespace="##local" processContents="lax"/>
        <any namespace="##other" processContents="lax"/>
        <group ref="tns:top-level-elements"/>
      </choice>
    </sequence>
    <!-- <anyAttribute namespace="##other" processContents="skip"/> -->
  </complexType>

  <simpleType name="Expression">
    <restriction base="string">
    <!-- o:Path patterns go here  -->
    </restriction>
  </simpleType>

  <simpleType name="QName">
    <!-- QName does not have to be prefix qualified -->
    <union memberTypes="NCName QName"/>
  </simpleType>

</schema>