<!--

    Copyright (c) 2000, 2018 Oracle and/or its affiliates. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!--

   This is the DTD defining the JavaServer Pages 1.2 Tag Library
   descriptor (.tld) (XML) file format/syntax.

   A Tag Library is a JAR file containing a valid instance of a Tag Library
   Descriptor (taglib.tld) file in the META-INF subdirectory, along with the
   appropriate implementing classes, and other resources required to
   implement the tags defined therein.

  -->

<!NOTATION WEB-JSPTAGLIB.1_2 PUBLIC
          "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN">

<!--
This is the XML DTD for the JSP 1.2 Tag Library Descriptor.
All JSP 1.2 tag library descriptors must include a DOCTYPE
of the following form:

  <!DOCTYPE taglib
        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
	"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

-->

<!--
The taglib tag is the document root, it defines:

tlib-version	the version of the tag library implementation

jsp-version	the version of JSP the tag library depends upon

short-name	a simple default short name that could be used by
		a JSP authoring tool to create names with a mnemonic
		value; for example, the it may be used as the prefered
		prefix value in taglib directives

uri		a uri uniquely identifying this taglib

display-name    the display-name element contains a short name that
                is intended to be displayed by tools
small-icon      optional small-icon that can be used by tools

large-icon      optional large-icon that can be used by tools

description	a simple string describing the "use" of this taglib,
		should be user discernable

validator       optional TagLibraryValidator information

listener        optional event listener specification


-->

<!ELEMENT taglib (tlib-version, jsp-version, short-name, uri?,
                  display-name?, small-icon?, large-icon?, description?,
                  validator?, listener*, tag+) >

<!ATTLIST taglib id ID #IMPLIED
	  xmlns CDATA #FIXED
		"http://java.sun.com/JSP/TagLibraryDescriptor"
>

<!--
Describes this version (number) of the taglibrary (dewey decimal)

#PCDATA ::= [0-9]*{ "."[0-9] }0..3
-->

<!ELEMENT tlib-version (#PCDATA) >

<!--
Describes the JSP version (number) this taglibrary requires in
order to function (dewey decimal)

The default is 1.2

#PCDATA ::= [0-9]*{ "."[0-9] }0..3
-->

<!ELEMENT jsp-version  (#PCDATA) >

<!--
Defines a short (default) short-name to be used for tags and
variable names used/created by this tag library.  Do not use
white space, and do not start with digits or underscore.

#PCDATA ::= NMTOKEN
-->

<!ELEMENT short-name      (#PCDATA) >

<!--
Defines a public URI that uniquely identifies this version of
the taglibrary.  Leave it empty if it does not apply.
-->

<!ELEMENT uri	 (#PCDATA) >

<!--
Defines an arbitrary text string descirbing the tag library
-->

<!ELEMENT description	(#PCDATA) >

<!--

Defines an optional validator that can be used to
validate the conformance of a JSP page to using this tag library.
-->

<!ELEMENT validator (validator-class, init-param*, description?) >


<!--

Defines the TagLibraryValidator class that can be used to
validate the conformance of a JSP page to using this tag library.
-->

<!ELEMENT validator-class (#PCDATA) >


<!--

The init-param element contains a name/value pair as an
initialization param
-->

<!ELEMENT init-param (param-name, param-value, description?)>

<!--

The param-name element contains the name of a parameter.
-->

<!ELEMENT param-name (#PCDATA)>

<!--

The param-value element contains the value of a parameter.
-->

<!ELEMENT param-value (#PCDATA)>


<!--

Defines an optional event listener object to be instantiated and
registered automatically.
-->

<!ELEMENT listener (listener-class) >

<!--

The listener-class element declares a class in the application that
must be registered as a web application listener bean.  See the
Servlet 2.3 specification for details.
-->

<!ELEMENT listener-class (#PCDATA) >


<!--
The tag defines a unique tag in this tag library.  It has one
attribute, id.

The tag element may have several subelements defining:

name              The unique action name

tag-class         The tag handler class implementing
                  javax.servlet.jsp.tagext.Tag

tei-class         An optional subclass of
                  javax.servlet.jsp.tagext.TagExtraInfo

body-content      The body content type

display-name      A short name that is intended to be displayed
                  by tools

small-icon        Optional small-icon that can be used by tools

large-icon        Optional large-icon that can be used by tools

description       Optional tag-specific information

variable          Optional scripting variable information

attribute         All attributes of this action

example           Optional informal description of an example of a
                  use of this tag

-->

<!ELEMENT tag (name, tag-class, tei-class?, body-content?, display-name?,
               small-icon?, large-icon?, description?, variable*, attribute*,
               example?) >

<!--
Defines the subclass of javax.serlvet.jsp.tagext.Tag that implements
the request time semantics for this tag. (required)

#PCDATA ::= fully qualified Java class name
-->

<!ELEMENT tag-class (#PCDATA) >

<!--
Defines the subclass of javax.servlet.jsp.tagext.TagExtraInfo for
this tag. (optional)

If this is not given, the class is not consulted at translation time.

#PCDATA ::= fully qualified Java class name
-->

<!ELEMENT tei-class (#PCDATA) >

<!--
Provides a hint as to the content of the body of this tag. Primarily
intended for use by page composition tools.

There are currently three values specified:

tagdependent	The body of the tag is interpreted by the tag
		implementation itself, and is most likely in a
		different "langage", e.g embedded SQL statements.

JSP		The body of the tag contains nested JSP syntax

empty		The body must be empty

The default (if not defined) is JSP

#PCDATA ::=  tagdependent | JSP | empty

-->

<!ELEMENT body-content (#PCDATA) >

<!--

The display-name element contains a short name that is intended
to be displayed by tools.
-->

<!ELEMENT display-name (#PCDATA) >


<!--

The large-icon element contains the name of a file containing a large
(32 x 32) icon image.  The file name is a relative path within the
tag library.  The image must be either in the JPEG or GIF format, and
the file name must end with the suffix ".jpg" or ".gif" respectively.
The icon can be used by tools.
-->

<!ELEMENT large-icon (#PCDATA) >

<!--

The small-icon element contains the name of a file containing a large
(32 x 32) icon image.  The file name is a relative path within the
tag library.  The image must be either in the JPEG or GIF format, and
the file name must end with the suffix ".jpg" or ".gif" respectively.
The icon can be used by tools.
-->

<!ELEMENT small-icon (#PCDATA) >

<!--

The example element contains an informal description of an example
of the use of a tag.
-->

<!ELEMENT example (#PCDATA) >

<!--

The variable tag provides information on the scripting variables
defined by this tag.  It is a (translation time) error for a tag
that has one or more variable subelements to have a TagExtraInfo
class that returns a non-null object.

The subelements of variable are of the form:

name-given               The variable name as a constant

name-from-attribute      The name of an attribute whose (translation
                         time) value will give the name of the
                         variable.  One of name-given or
                         name-from-attribute is required.

variable-class           Name of the class of the variable.
                         java.lang.String is default.

declare                  Whether the variable is declared or not.
                         True is the default.

scope                    The scope of the scripting varaible
                         defined.  NESTED is default.

description              Optional description of this variable

-->

<!ELEMENT variable ( (name-given | name-from-attribute), variable-class?,
                    declare?, scope?, description?) >

<!--

The name for the scripting variable.  One of name-given or
name-from-attribute is required.
-->

<!ELEMENT name-given (#PCDATA) >

<!--

The name of an attribute whose (translation-time) value will give
the name of the variable.  One of name-given or name-from-attribute
is required.
-->

<!ELEMENT name-from-attribute (#PCDATA) >

<!--

The optional name of the class for the scripting variable.  The
default is java.lang.String.
-->

<!ELEMENT variable-class (#PCDATA) >

<!--

Whether the scripting variable is to be defined or not.  See
TagExtraInfo for details.  This element is optional and "true"
is the default.
-->

<!ELEMENT declare (#PCDATA) >

<!--

The scope of the scripting variable.  See TagExtraInfo for details.
The element is optional and "NESTED" is the default.  Other legal
values are "AT_BEGIN" and "AT_END".
-->

<!ELEMENT scope (#PCDATA) >

<!--

The attribute tag defines an attribute for the nesting tag

An attribute definition is composed of:
	
- the attributes name (required)
- if the attribute is required or optional (optional)
- if the attributes value may be dynamically calculated at runtime
  by a scriptlet expression (optional)
- the type of the attributes value (optional)
- an informal description of the meaning of the attribute (optional)

-->


<!--
The attribute tag defines an attribute for the nesting tag

An attribute definition is composed of:

- the attributes name (required)

- if the attribute is required or optional (optional)

- if the attributes value may be dynamically calculated at runtime
  by a scriptlet expression (optional)

- the type of the attributes value (optional)

- an informal description of the meaning of the attribute (optional)
-->

<!ELEMENT attribute (name, required? , rtexprvalue?, type?, description?) >

<!--
Defines the canonical name of a tag or attribute being defined

#PCDATA ::= NMTOKEN
-->

<!ELEMENT name	(#PCDATA) >

<!--
Defines if the nesting attribute is required or optional.

#PCDATA ::= true | false | yes | no

If not present then the default is "false", i.e the attribute
is optional.
-->

<!ELEMENT required    (#PCDATA) >

<!--
Defines if the nesting attribute can have scriptlet expressions as
a value, i.e the value of the attribute may be dynamically calculated
at request time, as opposed to a static value determined at translation
time.

#PCDATA ::= true | false | yes | no

If not present then the default is "false", i.e the attribute
has a static value
-->

<!ELEMENT rtexprvalue (#PCDATA) >


<!--

Defines the Java type of the attributes value.  For static values
(those determined at translation time) the type is always
java.lang.String.
-->

<!ELEMENT type (#PCDATA) >


<!-- ID attributes -->

<!ATTLIST tlib-version id ID #IMPLIED>
<!ATTLIST jsp-version id ID #IMPLIED>
<!ATTLIST short-name id ID #IMPLIED>
<!ATTLIST uri id ID #IMPLIED>
<!ATTLIST description id ID #IMPLIED>
<!ATTLIST example id ID #IMPLIED>
<!ATTLIST tag id ID #IMPLIED>
<!ATTLIST tag-class id ID #IMPLIED>
<!ATTLIST tei-class id ID #IMPLIED>
<!ATTLIST body-content id ID #IMPLIED>
<!ATTLIST attribute id ID #IMPLIED>
<!ATTLIST name id ID #IMPLIED>
<!ATTLIST required id ID #IMPLIED>
<!ATTLIST rtexprvalue id ID #IMPLIED>


<!ATTLIST param-name id ID #IMPLIED>
<!ATTLIST param-value id ID #IMPLIED>
<!ATTLIST listener id ID #IMPLIED>
<!ATTLIST listener-class id ID #IMPLIED>
