<?xml version="1.0" encoding="UTF-8" ?>
        <!--
               Copyright 2009-2018 the original author or authors.

               Licensed 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.

        -->
        <!ELEMENT mapper (cache-ref | cache | resultMap* | parameterMap* | sql* | insert* | update* | delete* | select* )+>
        <!ATTLIST mapper
                namespace CDATA #IMPLIED
                >

        <!ELEMENT cache-ref EMPTY>
        <!ATTLIST cache-ref
                namespace CDATA #REQUIRED
                >

        <!ELEMENT cache (property*)>
        <!ATTLIST cache
                type CDATA #IMPLIED
                eviction CDATA #IMPLIED
                flushInterval CDATA #IMPLIED
                size CDATA #IMPLIED
                readOnly CDATA #IMPLIED
                blocking CDATA #IMPLIED
                >

        <!ELEMENT parameterMap (parameter+)?>
        <!ATTLIST parameterMap
                id CDATA #REQUIRED
                type CDATA #REQUIRED
                >

        <!ELEMENT parameter EMPTY>
        <!ATTLIST parameter
                property CDATA #REQUIRED
                javaType CDATA #IMPLIED
                jdbcType CDATA #IMPLIED
                mode (IN | OUT | INOUT) #IMPLIED
                resultMap CDATA #IMPLIED
                scale CDATA #IMPLIED
                typeHandler CDATA #IMPLIED
                >

        <!ELEMENT resultMap (constructor?,id*,result*,association*,collection*, discriminator?)>
        <!ATTLIST resultMap
                id CDATA #REQUIRED
                type CDATA #REQUIRED
                extends CDATA #IMPLIED
                autoMapping (true|false) #IMPLIED
                >

        <!ELEMENT constructor (idArg*,arg*)>

        <!ELEMENT id EMPTY>
        <!ATTLIST id
                property CDATA #IMPLIED
                javaType CDATA #IMPLIED
                column CDATA #IMPLIED
                jdbcType CDATA #IMPLIED
                typeHandler CDATA #IMPLIED
                >

        <!ELEMENT result EMPTY>
        <!ATTLIST result
                property CDATA #IMPLIED
                javaType CDATA #IMPLIED
                column CDATA #IMPLIED
                jdbcType CDATA #IMPLIED
                typeHandler CDATA #IMPLIED
                >

        <!ELEMENT idArg EMPTY>
        <!ATTLIST idArg
                javaType CDATA #IMPLIED
                column CDATA #IMPLIED
                jdbcType CDATA #IMPLIED
                typeHandler CDATA #IMPLIED
                select CDATA #IMPLIED
                resultMap CDATA #IMPLIED
                name CDATA #IMPLIED
                columnPrefix CDATA #IMPLIED
                >

        <!ELEMENT arg EMPTY>
        <!ATTLIST arg
                javaType CDATA #IMPLIED
                column CDATA #IMPLIED
                jdbcType CDATA #IMPLIED
                typeHandler CDATA #IMPLIED
                select CDATA #IMPLIED
                resultMap CDATA #IMPLIED
                name CDATA #IMPLIED
                columnPrefix CDATA #IMPLIED
                >

        <!ELEMENT collection (constructor?,id*,result*,association*,collection*, discriminator?)>
        <!ATTLIST collection
                property CDATA #REQUIRED
                column CDATA #IMPLIED
                javaType CDATA #IMPLIED
                ofType CDATA #IMPLIED
                jdbcType CDATA #IMPLIED
                select CDATA #IMPLIED
                resultMap CDATA #IMPLIED
                typeHandler CDATA #IMPLIED
                notNullColumn CDATA #IMPLIED
                columnPrefix CDATA #IMPLIED
                resultSet CDATA #IMPLIED
                foreignColumn CDATA #IMPLIED
                autoMapping (true|false) #IMPLIED
                fetchType (lazy|eager) #IMPLIED
                >

        <!ELEMENT association (constructor?,id*,result*,association*,collection*, discriminator?)>
        <!ATTLIST association
                property CDATA #REQUIRED
                column CDATA #IMPLIED
                javaType CDATA #IMPLIED
                jdbcType CDATA #IMPLIED
                select CDATA #IMPLIED
                resultMap CDATA #IMPLIED
                typeHandler CDATA #IMPLIED
                notNullColumn CDATA #IMPLIED
                columnPrefix CDATA #IMPLIED
                resultSet CDATA #IMPLIED
                foreignColumn CDATA #IMPLIED
                autoMapping (true|false) #IMPLIED
                fetchType (lazy|eager) #IMPLIED
                >

        <!ELEMENT discriminator (case+)>
        <!ATTLIST discriminator
                column CDATA #IMPLIED
                javaType CDATA #REQUIRED
                jdbcType CDATA #IMPLIED
                typeHandler CDATA #IMPLIED
                >

        <!ELEMENT case (constructor?,id*,result*,association*,collection*, discriminator?)>
        <!ATTLIST case
                value CDATA #REQUIRED
                resultMap CDATA #IMPLIED
                resultType CDATA #IMPLIED
                >

        <!ELEMENT property EMPTY>
        <!ATTLIST property
                name CDATA #REQUIRED
                value CDATA #REQUIRED
                >

        <!ELEMENT typeAlias EMPTY>
        <!ATTLIST typeAlias
                alias CDATA #REQUIRED
                type CDATA #REQUIRED
                >

        <!ELEMENT select (#PCDATA | include | trim | where | set | foreach | for | choose | if | bind)*>
        <!ATTLIST select
                id CDATA #REQUIRED
                parameterMap CDATA #IMPLIED
                parameterType CDATA #IMPLIED
                resultMap CDATA #IMPLIED
                resultType CDATA #IMPLIED
                resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE | DEFAULT) #IMPLIED
                statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
                fetchSize CDATA #IMPLIED
                timeout CDATA #IMPLIED
                flushCache (true|false) #IMPLIED
                useCache (true|false) #IMPLIED
                databaseId CDATA #IMPLIED
                lang CDATA #IMPLIED
                resultOrdered (true|false) #IMPLIED
                resultSets CDATA #IMPLIED
                >

        <!ELEMENT insert (#PCDATA | selectKey | include | trim | where | set | foreach | for | choose | if | bind)*>
        <!ATTLIST insert
                id CDATA #REQUIRED
                parameterMap CDATA #IMPLIED
                parameterType CDATA #IMPLIED
                timeout CDATA #IMPLIED
                flushCache (true|false) #IMPLIED
                statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
                keyProperty CDATA #IMPLIED
                useGeneratedKeys (true|false) #IMPLIED
                keyColumn CDATA #IMPLIED
                databaseId CDATA #IMPLIED
                lang CDATA #IMPLIED
                >

        <!ELEMENT selectKey (#PCDATA | include | trim | where | set | foreach | for | choose | if | bind)*>
        <!ATTLIST selectKey
                resultType CDATA #IMPLIED
                statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
                keyProperty CDATA #IMPLIED
                keyColumn CDATA #IMPLIED
                order (BEFORE|AFTER) #IMPLIED
                databaseId CDATA #IMPLIED
                >

        <!ELEMENT update (#PCDATA | selectKey | include | trim | where | set | foreach | for | choose | if | bind)*>
        <!ATTLIST update
                id CDATA #REQUIRED
                parameterMap CDATA #IMPLIED
                parameterType CDATA #IMPLIED
                timeout CDATA #IMPLIED
                flushCache (true|false) #IMPLIED
                statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
                keyProperty CDATA #IMPLIED
                useGeneratedKeys (true|false) #IMPLIED
                keyColumn CDATA #IMPLIED
                databaseId CDATA #IMPLIED
                lang CDATA #IMPLIED
                >

        <!ELEMENT delete (#PCDATA | include | trim | where | set | foreach | for | choose | if | bind)*>
        <!ATTLIST delete
                id CDATA #REQUIRED
                parameterMap CDATA #IMPLIED
                parameterType CDATA #IMPLIED
                timeout CDATA #IMPLIED
                flushCache (true|false) #IMPLIED
                statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
                databaseId CDATA #IMPLIED
                lang CDATA #IMPLIED
                >

        <!-- Dynamic -->

        <!ELEMENT include (property+)?>
        <!ATTLIST include
                refid CDATA #REQUIRED
                >

        <!ELEMENT bind EMPTY>
        <!ATTLIST bind
                name CDATA #REQUIRED
                value CDATA #REQUIRED
                >

        <!ELEMENT sql (#PCDATA | include | trim | where | set | foreach | for | choose | if | bind)*>
        <!ATTLIST sql
                id CDATA #REQUIRED
                lang CDATA #IMPLIED
                databaseId CDATA #IMPLIED
                >

        <!ELEMENT trim (#PCDATA | include | trim | where | set | foreach | for | choose | if | bind)*>
        <!ATTLIST trim
                prefix CDATA #IMPLIED
                prefixOverrides CDATA #IMPLIED
                suffix CDATA #IMPLIED
                suffixOverrides CDATA #IMPLIED
                >
        <!ELEMENT where (#PCDATA | include | trim | where | set | foreach | for | choose | if | bind)*>
        <!ELEMENT set (#PCDATA | include | trim | where | set | foreach | for | choose | if | bind)*>

        <!ELEMENT foreach (#PCDATA | include | trim | where | set | foreach|for | choose | if | bind)*>
        <!ATTLIST foreach
                collection CDATA #REQUIRED
                item CDATA #IMPLIED
                index CDATA #IMPLIED
                open CDATA #IMPLIED
                close CDATA #IMPLIED
                separator CDATA #IMPLIED
                >
        <!ELEMENT for (#PCDATA | include | trim | where | set | for | choose | if | bind)*>
        <!ATTLIST for
                collection CDATA #REQUIRED
                item CDATA #IMPLIED
                index CDATA #IMPLIED
                open CDATA #IMPLIED
                close CDATA #IMPLIED
                separator CDATA #IMPLIED
                >
        <!ELEMENT choose (when* , otherwise?)>
        <!ELEMENT when (#PCDATA | include | trim | where | set | foreach | for | choose | if | bind)*>
        <!ATTLIST when
                test CDATA #REQUIRED
                >
        <!ELEMENT otherwise (#PCDATA | include | trim | where | set | foreach | for | choose | if | bind)*>

        <!ELEMENT if (#PCDATA | include | trim | where | set | foreach | for | choose | if | bind)*>
        <!ATTLIST if
                test CDATA #REQUIRED
                >


