<!--
 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.
-->
<!-- DTD for JSP 2.0
     thanks to Bob Foster, WebGain
-->

<!-- 
     This DTD is not conditional on any parameter entities in the internal
     subset and does not export any general entities.
-->

<!--================== Constrained Names ====================================-->

<!ENTITY % URI "CDATA">
    <!-- a Uniform Resource Identifier, see [RFC2396] -->

<!ENTITY % UriList "CDATA">
    <!-- a space separated list of Uniform Resource Identifiers -->

<!ENTITY % URL "CDATA">
    <!-- a relative urlSpec is as in Section 2.10.2. -->

<!ENTITY % BeanID "IDREF">
    <!-- a previously declared bean ID in the current scope. -->

<!ENTITY % Prefix "CDATA">
    <!-- a Name that contains no : characters. -->

<!ENTITY % ClassName "CDATA">
    <!-- a fully qualified class name. -->

<!ENTITY % TypeName "CDATA">
    <!-- a fully qualified class or interface name. -->

<!ENTITY % BeanName "CDATA">
    <!-- a bean name as expected by java.beans.Beans instantiate(). -->

<!ENTITY % Content "CDATA">
    <!-- a MIME type followed by an IANA charset, as " type [; S? ['charset='] charset] " -->

<!ENTITY % Length "CDATA">
    <!-- nn for pixels or nn% for percentage length -->

<!ENTITY % Pixels "CDATA">
    <!-- integer representing length in pixels -->

<!ENTITY % Bool "(true|false|yes|no)">
    <!-- boolean -->

<!-- used for object, applet, img, input and iframe -->
<!ENTITY % ImgAlign "(top|middle|bottom|left|right)">

<!--=================== Element Groups ====================================-->

<!ENTITY % Directives "jsp:directive.page|jsp:directive.include">

<!ENTITY % Scripts "jsp:scriptlet|jsp:declaration|jsp:expression">

<!ENTITY % Actions
    "jsp:useBean
    |jsp:setProperty
    |jsp:getProperty
    |jsp:include
    |jsp:forward
    |jsp:plugin"
>

<!ENTITY % Body "(jsp:text|%Directives;|%Scripts;|%Actions;)*">


<!-- ============================ Elements ============================ -->

<!--    Root element of a JSP page.
-->
<!ELEMENT jsp:root %Body;>
<!ATTLIST jsp:root
    xmlns:jsp       CDATA           "http://java.sun.com/JSP/Page"
    version         CDATA           #REQUIRED
>

<!ELEMENT jsp:directive.page EMPTY>
<!ATTLIST jsp:directive.page
    language        CDATA           "java"
    extends         %ClassName;     #IMPLIED
    contentType     %Content;       "text/html; ISO-8859-1"
    import          CDATA           #IMPLIED
    session         %Bool;          "true"
    buffer          CDATA           "8kb"
    autoFlush       %Bool;          "true"
    isThreadSafe    %Bool;          "true"
    info            CDATA           #IMPLIED
    errorPage       %URL;           #IMPLIED
    isErrorPage     %Bool;          "false"
    pageEncoding    CDATA           #IMPLIED
    isELIgnored     %Bool;          #IMPLIED
>

<!-- the jsp:directive.include only appears in JSP documents and does
     not appear in the XML views of JSP pages.
-->

<!ELEMENT jsp:directive.include EMPTY>
<!ATTLIST jsp:directive.include
    file            %URI;           #REQUIRED
>

<!ELEMENT jsp:scriptlet (#PCDATA)>

<!ELEMENT jsp:declaration (#PCDATA)>

<!ELEMENT jsp:expression (#PCDATA)>

<!ELEMENT jsp:useBean %Body;>
<!ATTLIST jsp:useBean
    id              ID              #REQUIRED
    class           %ClassName;     #IMPLIED
    type            %TypeName;      #IMPLIED
    beanName        %BeanName;      #IMPLIED
    scope           (page
                    |session
                    |request
                    |application)   "page"
>

<!ELEMENT jsp:setProperty EMPTY>
<!ATTLIST jsp:setProperty
    name            %BeanID;        #REQUIRED
    property        CDATA           #REQUIRED
    value           CDATA           #IMPLIED
    param           CDATA           #IMPLIED
>

<!ELEMENT jsp:getProperty EMPTY>
<!ATTLIST jsp:getProperty
    name            %BeanID;        #REQUIRED
    property        CDATA           #REQUIRED
>

<!ELEMENT jsp:include (jsp:param*)>
<!ATTLIST jsp:include
    flush           %Bool;          "false"
    page            %URL;           #REQUIRED
>

<!ELEMENT jsp:forward (jsp:param*)>
<!ATTLIST jsp:forward
    page            %URL;           #REQUIRED
>

<!ELEMENT jsp:plugin (jsp:params?, jsp:fallback?)>
<!ATTLIST jsp:plugin
    type            (bean|applet)   #REQUIRED
    code            %URI;           #IMPLIED
    codebase        %URI;           #IMPLIED
    align           %ImgAlign;      #IMPLIED
    archive         %UriList;       #IMPLIED
    height          %Length;        #IMPLIED
    hspace          %Pixels;        #IMPLIED
    jreversion      CDATA           "1.2"
    name            NMTOKEN         #IMPLIED
    vspace          %Pixels;        #IMPLIED
    width           %Length;        #IMPLIED
    nspluginurl     %URI;           #IMPLIED
    iepluginurl     %URI;           #IMPLIED
>

<!ELEMENT jsp:params (jsp:param+)>

<!ELEMENT jsp:param EMPTY>
<!ATTLIST jsp:param
    name            CDATA           #REQUIRED
    value           CDATA           #REQUIRED
>

<!ELEMENT jsp:text #PCDATA>

