<?xml version="1.0"?>
<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements. See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership. The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License. You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied. See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->

<!--
  Test schema for the "chameleon" namespace design described in [1].
  See also AXIS2-4251.
  
  [1] http://www.xfront.com/ZeroOneOrManyNamespaces.html
-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://apache.org/axis2/schema/chameleon"
            xmlns="http://apache.org/axis2/schema/chameleon"
            elementFormDefault="qualified">
    <xsd:include schemaLocation="chameleon_include.xsd"/>
    <xsd:element name="MainSchemaElement">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="param" type="SupportingSchemaType"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>