<!--
  ~ 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.
  -->

<schema elementFormDefault="qualified"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:tns="org.apache.axis2.test.group"
        targetNamespace="org.apache.axis2.test.group">

    <xs:element name="TestSequenceGroupElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="param1" type="xs:string"/>
                <xs:group ref="tns:TestSequenceGroup"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:group name="TestSequenceGroup">
        <xs:sequence>
            <xs:element name="sequenceParam1" type="xs:string"/>
            <xs:element name="sequenceParam2" type="xs:string"/>
        </xs:sequence>
    </xs:group>
    <xs:element name="TestChoiceGroupElement">
        <xs:complexType>
            <xs:choice>
                <xs:element name="param1" type="xs:string"/>
                <xs:group ref="tns:TestChoiceGroup"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:group name="TestChoiceGroup">
        <xs:choice>
            <xs:element name="choiceParam1" type="xs:string"/>
            <xs:element name="choiceParam2" type="xs:string"/>
        </xs:choice>
    </xs:group>
    <xs:element name="TestSequenceNestedGroupElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="param1" type="xs:string"/>
                <xs:group ref="tns:TestSequenceNestedGroup"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:group name="TestSequenceNestedGroup">
        <xs:sequence>
            <xs:element name="nestedSequenceParam1" type="xs:string"/>
            <xs:group ref="tns:TestSequenceGroup"/>
        </xs:sequence>
    </xs:group>
    <xs:element name="TestChoiceNestedGroupElement">
        <xs:complexType>
            <xs:choice>
                <xs:element name="param1" type="xs:string"/>
                <xs:group ref="tns:TestChoiceNestedGroup"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:group name="TestChoiceNestedGroup">
        <xs:choice>
            <xs:element name="nestedChoiceParam1" type="xs:string"/>
            <xs:group ref="tns:TestChoiceGroup"/>
        </xs:choice>
    </xs:group>
    <xs:element name="TestAttributeGroupElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="param1" type="xs:string"/>
            </xs:sequence>
            <xs:attributeGroup ref="tns:TestAttributeGroup" />
        </xs:complexType>
    </xs:element>
    <xs:attributeGroup name="TestAttributeGroup">
        <xs:attribute name="attribute1" type="xs:string"/>
    </xs:attributeGroup>
    <xs:element name="TestNestedAttributeGroupElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="param1" type="xs:string"/>
            </xs:sequence>
            <xs:attributeGroup ref="tns:TestNestedAttributeGroup" />
        </xs:complexType>
    </xs:element>
    <xs:attributeGroup name="TestNestedAttributeGroup">
        <xs:attribute name="attribute2" type="xs:string"/>
        <xs:attributeGroup ref="tns:TestAttributeGroup" />
    </xs:attributeGroup>

</schema>