<document>
  <header>
    <product>resin</product>
    <title>JSP TLD Relax-NG Schema</title>
    <version>Resin 3.0</version>
    <description>
      <p>The formal definition for the *.tld file</p>
    </description>
  </header>

  <body>
    <summary/>

<section title="Example taglib">

<example title="test.tld">
&lt;taglib xmlns="http://java.sun.com/xml/ns/j2ee" version="2.0">
  &lt;tlib-version>1.0&lt;/tlib-version>
  &lt;short-name>x&lt;/short-name>
  &lt;uri>foo/zippee&lt;/uri>

  &lt;tag>
    &lt;name>foo&lt;/name>
    &lt;tag-class>test.MyTag&lt;/tag-class>

    &lt;attribute>
      &lt;name>var&lt;/name>
    &lt;/attribute>
  &lt;/tag>
&lt;/taglib>
</example>

</section>

<section title="Relax-NG Schema">
<def>
default namespace j2ee = "http://java.sun.com/xml/ns/j2ee"
namespace local = ""

namespace xsi = "http://www.w3.org/2001/XMLSchema-instance"

include "../../server/resin/j2ee.rnc"

j2ee_dewey-version = string
j2ee_generic-boolean = string
j2ee_java-identifier = string
j2ee_path = string
j2ee_variable = string

jsp20_attribute = element attribute {
  attribute id { string }?,

  jsp20_description*,

  element name { j2ee_java-identifier },

  element required { j2ee_generic-boolean }?,

  ((element rtexprvalue { j2ee_generic-boolean }?,
     element type { j2ee_fully-qualified-class }?)

   | element fragment { j2ee_generic-boolean }?)
}

jsp20_body-content = element body-content {
  "tagdependent"
  | "JSP"
  | "empty"
  | "scriptless"
}

jsp20_description = element description { string }*

jsp20_display-name = element display-name { string }*

jsp20_extension-Type =
  (attribute id { string }?,

   attribute namespace { string },

   jsp20_extension-element+)

jsp20_extension-element = element extension-element {
  attribute id { string }?
}

jsp20_function = element function {
  attribute id { string }?,

  j2ee_description-Group,

  element name { string },

  element function-class { j2ee_fully-qualified-class },

  element function-signature { string },

  element example { string }?,

  element function-extension { jsp20_extension-Type }*
}

jsp20_icon = element icon { string }*

jsp20_init-param = element init-param {
  element param-name { string },

  element param-value { string }
}

jsp20_listener = element listener {
  attribute id { string }?,

  element listener-class { j2ee_fully-qualified-class }
}

jsp20_tag = element tag {
  attribute id { string }?,

  j2ee_description-Group,

  element name { string },

  element tag-class { j2ee_fully-qualified-class },

  element tei-class { j2ee_fully-qualified-class }?,

  jsp20_body-content?,

  jsp20_variable*,

  jsp20_attribute*,

  element dynamic-attributes { j2ee_generic-boolean }?,

  element example { string }?,

  element tag-extension { jsp20_extension-Type }*
}

jsp20_tag-file = element tag-file {
  attribute id { string }?,

  j2ee_description-Group,

  element name { string },

  element path { j2ee_path },

  element example { string }?,

  element tag-extension { jsp20_extension-Type }*
}

jsp20_taglib = element taglib {
  attribute version { "2.0" },

  attribute xsi:schemaLocation { string }?,

  j2ee_description-Group,

  element tlib-version { j2ee_dewey-version },

  element short-name { string },

  element uri { string }?,

  jsp20_validator?,

  jsp20_listener?,

  jsp20_tag*,

  jsp20_tag-file*,

  jsp20_function*,

  element taglib-extension { jsp20_extension-Type }*
}

jsp20_validator = element validator {
  attribute id { string }?,

  jsp20_description*,

  element validator-class { j2ee_fully-qualified-class },

  jsp20_init-param*
}

jsp20_variable = element variable {
  attribute id { string }?,

  jsp20_description*,

  ( element name-given { j2ee_java-identifier }
  | element name-from-attribute { j2ee_java-identifier }),

  element variable-class { j2ee_fully-qualified-class }?,

  element declare { j2ee_generic-boolean }?,

  element scope { "AT_BEGIN" | "NESTED" | "AT_END" }?
}
</def>
</section>

  </body>
</document>
  
