<xsd:schema
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:xqx="http://www.w3.org/2005/XQueryX"
     xmlns:xqxuf="http://www.w3.org/2007/xquery-update-10"
     xmlns:xqxsx="http://www.w3.org/2008/xquery-sx-10"
     targetNamespace="http://www.w3.org/2008/xquery-sx-10"
     elementFormDefault="qualified" 
     attributeFormDefault="unqualified">

<!-- Initial creation                  2008-03-01: Jim Melton -->
<!-- Added FunctionDecl redefinition   2008-03-11: Jim Melton -->

  <xsd:import namespace="http://www.w3.org/2005/XQueryX"
     schemaLocation="http://www.w3.org/2008/xquery-sx-10/xquery-sx-10-xqueryx-redef.xsd"/>

  <!-- Declare new type for constant declarations             -->
  <xsd:complexType name="constDecl">
    <xsd:sequence>
      <xsd:element name="constName" type="xqx:QName"/>
      <xsd:element ref="xqx:typeDeclaration" minOccurs="0"/>
      <xsd:element name="constValue" type="xqx:exprWrapper"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="constDecl" type="xqxsx:constDecl"
               substitutionGroup="xqx:prologPartTwoItem"/>


  <!-- Create substitution grp for scripting extension exprs  -->
  <xsd:complexType name="expr">
    <xsd:complexContent>
      <xsd:extension base="xqx:expr"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!-- Make scripting extension subst grp part of expr grp    -->
  <xsd:element name="expr" type="xqxsx:expr" abstract="true"
               substitutionGroup="xqx:expr"/>


  <!-- AssignmentExpr:                                        -->
  <!--   AssignmentExpr ::= "set" "$" VarName ":=" ExprSingle -->
  <xsd:complexType name="assignmentExpr">
    <xsd:complexContent>
      <xsd:extension base="xqxsx:expr">
        <xsd:sequence>
          <xsd:element ref="xqx:positionalVariableBinding"/>
          <xsd:element name="assignedExpr" type="xqx:exprWrapper"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="assignmentExpr" type="xqxsx:assignmentExpr"
               substitutionGroup="xqxsx:expr"/>


  <!-- Block (1 of 3):                                        -->
  <!--   Block ::= "{" BlockDecls BlockBody "}"               -->
  <!--   BlockDecls ::= (BlockVarDecl ";")*                   -->
  <xsd:complexType name="block">
    <xsd:complexContent>
      <xsd:extension base="xqxsx:expr">
        <xsd:sequence>
          <xsd:element ref="xqxsx:blockVarDecl"
                       minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element ref="xqxsx:blockBody"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="block" type="xqxsx:block"
               substitutionGroup="xqxsx:expr"/>

  <!-- Block (2 of 3):                                        -->
  <!--   BlockVarDecl ::=                                     -->
  <!--     "declare" "$" VarName TypeDeclaration?             -->
  <!--             (":=" ExprSingle)?                         -->
  <!--          ("," "$" VarName TypeDeclaration?             -->
  <!--             (":=" ExprSingle)? )*                      -->
  <xsd:complexType name="blockVarDecl">
      <xsd:sequence minOccurs="1" maxOccurs="unbounded">
        <xsd:element name="varName" type="xqx:QName"/>
        <xsd:element ref="xqx:typeDeclaration" minOccurs="0"/>
        <xsd:element name="varValue" type="xqx:exprWrapper"
                     minOccurs="0"/>
      </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="blockVarDecl" type="xqxsx:blockVarDecl"/>

  <!-- Block (3 of 3):                                        -->
  <!--   BlockBody ::= (Expr ";")*                            -->
  <xsd:complexType name="blockBody">
    <xsd:sequence>
      <xsd:element name="blockExpr" type="xqx:exprWrapper"
                   minOccurs="1" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="blockBody" type="xqxsx:blockBody"/>


  <!-- ExitExpr:                                       -->
  <!--   ExitExpr ::= "exit" "with" ExprSingle      -->
  <xsd:element name="exitExpr" type="xqxsx:expr"
               substitutionGroup="xqxsx:expr"/>


  <!-- WhileExpr:                                             -->
  <!--   WhileExpr ::= "while" "(" ExprSingle ")" Block       -->
  <xsd:complexType name="whileExpr">
    <xsd:complexContent>
      <xsd:extension base="xqxsx:expr">
        <xsd:sequence>
          <xsd:element name="whileTest" type="xqx:exprWrapper"/>
          <xsd:element ref="xqxsx:block"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="whileExpr" type="xqxsx:whileExpr"
               substitutionGroup="xqxsx:expr"/>


  <!-- ContinueExpr:                                          -->
  <!--   ContinueExpr ::= "continue" "loop"                   -->
  <xsd:complexType name="continueExpr">
    <xsd:complexContent>
      <xsd:restriction base="xqxsx:expr"/>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="continueExpr" type="xqxsx:continueExpr"
               substitutionGroup="xqxsx:expr"/>


  <!-- BreakExpr:                                             -->
  <!--   BreakExpr ::= "break" "loop"                         -->
  <xsd:complexType name="breakExpr">
    <xsd:complexContent>
      <xsd:restriction base="xqxsx:expr"/>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="breakExpr" type="xqxsx:breakExpr"
               substitutionGroup="xqxsx:expr"/>

</xsd:schema>