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

   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.

   Use is subject to license terms.
  -->

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