Plasma GitLab Archive
Projects Blog Knowledge

<?xml version="1.0" encoding="ISO8859-1"?>

<!-- $Id: wd_application_2.dtd,v 3.6 2005-06-11 14:24:14 stolpmann Exp $ -->

<!-- This DTD should be referred to by the PUBLIC identifier:
     PUBLIC "-//NPC//DTD WDIALOG 2.3//EN"

     Version numbers: have the form major.minor; a change in a major
     number means that the versions are incompatible, while a
     change in the minor number means that the an application designed
     for a lower version number can also be parsed by the DTD with the
     higher version number (and it _should_ mean the same; however
     you should not rely on that).

     Table of PUBLIC IDs and CVS revision numbers:

     CVS revision         Corresponding PUBLIC ID
     ====================================================
     1.1 to 1.10          no assigned PUBLIC ID
     >= 1.11              "-//NPC//DTD WDIALOG 1.1//EN"
     >= 2.1               "-//NPC//DTD WDIALOG 2.1//EN"
     >= 3.2               "-//NPC//DTD WDIALOG 2.2//EN"
     >= 3.6               "-//NPC//DTD WDIALOG 2.3//EN"
  -->

<!-- TODO:
     add xml:space as valid attribute
 -->

<!-- Changes between 1.1 and 2.1:

     NEW

     - ui:context
     - ui:encode
     - Processing instructions:
       <?wd-debug-mode?> <?wd-prototype-mode?> <?onstartup-call-handle?>
     - ui:page has new attribute "popup"
     - ui:variable has new attribute "protected"

     RENAMED ELEMENTS:

     - ui:object -> ui:dialog
     - ui:extern -> ui:translate

     RENAMED ATTRIBUTES

     - start-object -> start-dialog
     - intern -> internal

     - For <ui:dynamic>, the attribute "type" has been replaced by
       "enc" and "special":
       type="html" is now enc="", special="no"  (the default)
       type="text" is now enc="", special="yes"

     OTHER RENAMINGS

     - The special variable type "object" is now called "dialog".
     - $intern -> $int
     - $extern -> $ext
     - $intern_js -> ${int/js}
     - $extern_js -> ${ext/js}

     STRUCTURAL CHANGES

     - ui:declaration has been removed. The element ui:variable may
       occur directly in a ui:dialog

     - There is no longer a certain order for ui:enumeration,
       ui:variable, ui:default, and ui:page

     WHITESPACE

     - Whitespace after the start tags <ui:template>, <ui:guard>,
       <ui:context>, and <ui:page> is ignored. Whitespace before the
       corresponding end tags is ignored, too
     - Whitespace after </ui:default> (inside <ui:template>), and
       after </ui:ui:param> (inside <ui:context) is ignored, too

     OTHER

     - The shorthand notations <t:NAME>, <q:NAME>, and <p:name> are now
       available
     - The notation ${name/enc1/enc2/...} applies the list of
       encodings before replacing the parameter. Works just like
       <ui:encode enc="enc1 enc2 ...">$name</ui:encode>
     - The notation $[name] is replaced by the contents of the dialog
       variable, just like <ui:dynamic variable="name"/>
     - The notation $[name/enc1/enc2/...] is replaced by the encoded
       contents of the dialog variable, like
       <ui:encode enc="enc1 enc2 ..."><ui:dynamic variable="name"/></ui:encode>
  -->

  <!-- Changes between 2.1 and 2.2:

     - New: ui:richbutton that maps to the BUTTON html element
     - New: "dot notation" can be used to access variables of subdialogs.
  -->

  <!-- Changes between 2.2 and 2.3:

     - ui:if: accepts now any number of values, and op can be any function name
     - ui:ifvar: op can be any function name
     - New: ui:ifexpr
  -->


<!ENTITY % major-version "2">


<!ENTITY % nametoken 'CDATA'>
   <!-- This was NMTOKEN, but NMTOKEN does not allow the character "$" we
        need for the formal parameters. So use CDATA instead.
     -->

<!ENTITY % nametokens 'CDATA'>
   <!-- This was NMTOKENS -->


<!ELEMENT ui:application ( ui:dialog | ui:template )+ >

<!ATTLIST ui:application
          start-dialog %nametoken; #REQUIRED
>

<!-- ui:application may contain the following processing instructions:

     <?wd-debug-mode?>

	The HTML output contains the state of the current dialog as
	HTML comments

     <?wd-prototype-mode?>

	Missing dialogs are invented on the fly

     <?wd-onstartup-call-handle?>

	Normally, the first method that is called after application
	startup is "prepare_page". This instruction causes that the
	first invoked method is "handle", followed by "prepare_page".
  -->

<!-- ************************************************************ -->

<!ELEMENT ui:dialog ( ( ui:enumeration |
                        ui:variable |
                        ui:context |
                        ui:page )* ) >

<!ATTLIST ui:dialog
          name          %nametoken; #REQUIRED
          start-page    %nametoken; #REQUIRED
	  lang-variable %nametoken; #IMPLIED
>

<!ELEMENT ui:enumeration ( ui:enum )*>

<!ATTLIST ui:enumeration
          name %nametoken; #REQUIRED>


<!ELEMENT ui:enum EMPTY>

<!ATTLIST ui:enum
          internal %nametoken; #REQUIRED
          external CDATA       #IMPLIED>

<!-- If "external" is left out, the default is to use the same value
     as for "internal.
  -->


<!ENTITY % value-literal "(ui:string-value | ui:enum-value | ui:dyn-enum-value |
                           ui:alist-value)" >

<!ELEMENT ui:variable ( %value-literal; )? >

<!ATTLIST ui:variable
          name        %nametoken;   #REQUIRED
          type        %nametoken;   "string"
          temporary   (yes|no)      "no"
          associative (yes|no)      "no"
          protected   (yes|no)      "no"
>

<!-- The name is an NMTOKEN with the exception that variable names must
     not contain '.'
  -->

<!-- "type": either "string", "dialog", "dynamic-enumerator", or the name of
           a declared enumerator.
     "temporary": if "yes", the variable is not put into the
           persistent store.
     "protected": if "yes", the variable cannot be modified by CGI parameters
  -->


<!-- NOTE dynamic enumerators:
     These have a different behaviour than declared enumerators. You can use
     them whereever an enumerator is allowed; but:

     - ui:checkbox, ui:radio, ui:select:
       A dynamic enumerator can be used to set up these interactors. After the
       page has been submitted, only those values of the enumerator are left
       which have been selected (the other values are lost forever). Only
       the internal values are sent back; the external values are lost.

       This has to do with the nature of dynamic enumerators; the base set of
       the enumerator is not known.

       In the case of ui:checkbox and ui:radio, two dynamic enumerators can
       be used to specify both the base set and the set of selected entries:

       <ui:template name="enum_template">
          <ui:checkbox variable="$v" value="$int"/>$ext
       </ui:template>

       <ui:enumerate template="enum_template" variable="base_enum">
          <ui:param name="v">select_enum</ui:param>
       </ui:enumerate>


     - ui:select: to solve this problem, use the attribute "base"
  -->

<!-- VALUE LITERALS:
     necessary to specify default values in variable declarations
  -->


<!ELEMENT ui:string-value (#PCDATA)* >

<!ELEMENT ui:enum-value (ui:enum-item)* >

<!ELEMENT ui:enum-item EMPTY>

<!ATTLIST ui:enum-item
          internal  %nametoken;   #REQUIRED>

<!ELEMENT ui:dyn-enum-value (ui:dyn-enum-item)* >

<!ELEMENT ui:dyn-enum-item EMPTY>

<!ATTLIST ui:dyn-enum-item
          internal  %nametoken;   #REQUIRED
          external  CDATA         #IMPLIED >

<!-- If "external" is left out, the default is to use the same value
     as for "internal.
  -->

<!ELEMENT ui:alist-value (ui:alist-item)* >

<!ELEMENT ui:alist-item %value-literal; >

<!ATTLIST ui:alist-item
          index  CDATA #REQUIRED>


<!-- ************************************************************ -->

<!ELEMENT ui:page ANY>

<!-- actually: ELEMENT ui:page (ui:expectparam*, ANY) -->


<!ATTLIST ui:page
          name         NMTOKEN  #REQUIRED
          from-caller  NMTOKENS #IMPLIED
          from-context NMTOKENS #IMPLIED
	  popup        (yes|no) "no"
>

  <!-- popup: whether the page can be used as popup page -->


<!ELEMENT ui:popup EMPTY>
<!ATTLIST ui:popup
          page  %nametoken;  #REQUIRED>

<!-- Puts here the javascript code to define the popup window referring
     to the specified page:
     Javascript functions open_<pagename>(), and
     close_popups()
  -->

<!ELEMENT ui:server-popup EMPTY>
<!ATTLIST ui:server-popup
          page  %nametoken;  #REQUIRED>


<!ELEMENT ui:dynamic EMPTY>

<!ATTLIST ui:dynamic
          variable  %nametoken;     #REQUIRED
          index     CDATA           #IMPLIED
          special   (yes|no)        "no"
          enc       %nametokens;    "">

<!-- insert the value of "variable". The attribute enc determines the
     encodings to apply to the value (default: do not apply encodings).
     Predefined encodings are:
     html, para, pre, js, jslong
     (see wd_encoding.mli for details)

     special="no": The replaced text is handled as any other data
       node. This usually means that it is html-encoded before output.

     special="yes": The replaced text is handled as if there were
       a <ui:special> around <ui:dynamic>. This turns the
       html-encoding off.
  -->


<!ELEMENT ui:encode ANY>

<!ATTLIST ui:encode
	  enc     %nametokens;    #REQUIRED>

<!-- Encode the contents of the node -->


<!ELEMENT ui:form ANY>

<!ATTLIST ui:form 
          action-suffix CDATA "">


<!-- ui:form:
     An ui:form adds the necessary hidden fields, and automatically
     determines the <form> attributes.

     action-suffix: This string is appended to the ACTION attribute
     of the generated FORM element
  -->


<!ELEMENT ui:button EMPTY>

<!ATTLIST ui:button
          name  %nametoken; #REQUIRED
          index CDATA       #IMPLIED
          label CDATA       #IMPLIED
          goto  %nametoken; #IMPLIED
          cgi   (auto|keep) "auto"
>


<!-- Parameter "cgi":
     "auto" means that the names of CGI parameters are automatically
     determined. This is the default and works always, but you do not
     know the name of the CGI parameter.
     "keep" means that the names of CGI parameters are derived from the
     name of the element or the variable the element refers to. This
     option is incompatible with "index".
 -->

<!-- CGI parameters for buttons:
     cgi="auto", no index:      "button_<id>"
     cgi="auto", index="..."    "xbutton_<id>"
     cgi="keep", name="<name>"  "button_<name>"
  -->

<!-- planned:
     "indirect": 'yes' or 'no'. If 'yes', "goto" is interpreted as the
        the name of the variable containing the page name
     "save":  the name of a variable storing the current page
  -->


<!ELEMENT ui:imagebutton EMPTY>

<!ATTLIST ui:imagebutton
          name  %nametoken; #REQUIRED
          index CDATA       #IMPLIED
          src   CDATA       #REQUIRED
          align CDATA       #IMPLIED
          goto  %nametoken; #IMPLIED
          cgi   (auto|keep) "auto"
>

<!-- CGI parameters for imagebuttons:
     cgi="auto", no index:      "imagebutton_<id>"
     cgi="auto", index="..."    "ximagebutton_<id>"
     cgi="keep", name="<name>"  "imagebutton_<name>"
  -->

<!-- planned: see ui:button -->

<!ELEMENT ui:richbutton ANY>

<!ATTLIST ui:richbutton
          name  %nametoken; #REQUIRED
          index CDATA       #IMPLIED
          goto  %nametoken; #IMPLIED
          cgi   (auto|keep) "auto"
>

<!-- CGI parameters for richbuttons: (same as for buttons)
     cgi="auto", no index:      "button_<id>"
     cgi="auto", index="..."    "xbutton_<id>"
     cgi="keep", name="<name>"  "button_<name>"
  -->

<!ELEMENT ui:checkbox EMPTY>

<!ATTLIST ui:checkbox
          variable %nametoken; #REQUIRED
          index    CDATA       #IMPLIED
          value    %nametoken; #REQUIRED
          cgi     (auto|keep)  "auto"
>

<!-- The checkbox is "on" if the "value" is member of the enumeration
     "variable".
  -->

<!-- CGI parameters for checkboxes:
     cgi="auto", no index:          "var_<id>"
     cgi="auto", index="..."        "var_<id>"
     cgi="keep", variable="<name>"  "var_<name>"
  -->


<!ELEMENT ui:radio EMPTY>

<!ATTLIST ui:radio
          variable %nametoken; #REQUIRED
          index    CDATA       #IMPLIED
          value    %nametoken; #REQUIRED
          cgi     (auto|keep)  "auto"
>


<!-- The radio button is "on" if the "value" is member of the enumeration
     "variable". The radio buttons are glued together by their shared variable.
  -->

<!-- CGI parameters for radio buttons:
     cgi="auto", no index:          "var_<id>"
     cgi="auto", index="..."        "var_<id>"
     cgi="keep", variable="<name>"  "var_<name>"
  -->


<!ELEMENT ui:translate EMPTY>

<!ATTLIST ui:translate
          type     %nametoken; #REQUIRED
          internal %nametoken; #REQUIRED>

<!-- maps the internal value into an external value, for enumerator
     "type".
     This works only for declared enumerators.
  -->


<!ELEMENT ui:file EMPTY>

<!ATTLIST ui:file
          name     %nametoken; #REQUIRED
          cgi     (auto|keep)  "auto"
>


<!-- CGI parameters for file uploads:
     cgi="auto":                    "upload_<id>"
     cgi="keep", name="<name>"      "upload_<name>"
  -->

<!ELEMENT ui:password EMPTY>

<!ATTLIST ui:password
          variable  %nametoken; #REQUIRED
          index     CDATA       #IMPLIED
          maxlength CDATA       #IMPLIED
          size      CDATA       #IMPLIED
          cgi       (auto|keep) "auto"
>


<!-- CGI parameters for password elements:
     cgi="auto", no index:          "var_<id>"
     cgi="auto", index="..."        "var_<id>"
     cgi="keep", variable="<name>"  "var_<name>"
  -->

<!ELEMENT ui:text EMPTY>

<!ATTLIST ui:text
          variable  %nametoken; #REQUIRED
          index     CDATA       #IMPLIED
          maxlength CDATA       #IMPLIED
          size      CDATA       #IMPLIED
          cgi       (auto|keep) "auto"
>

<!-- CGI parameters for text boxes:
     cgi="auto", no index:          "var_<id>"
     cgi="auto", index="..."        "var_<id>"
     cgi="keep", variable="<name>"  "var_<name>"
  -->

<!ELEMENT ui:select EMPTY>

<!ATTLIST ui:select
          variable  %nametoken;  #REQUIRED
          index     CDATA        #IMPLIED
          multiple  (yes|no)     "no"
          size      CDATA        #IMPLIED
          base      %nametoken;  #IMPLIED
          baseindex CDATA        #IMPLIED
          cgi       (auto|keep)  "auto"
>

<!-- 'base' is the name of a variable containing the base set.
     If 'base' is left out, either the base set of the declared
     enumerator of the 'variable' is used, or the current value
     of the dynamic enumerator 'variable'.
  -->

<!-- CGI parameters for selection boxes:
     cgi="auto", no index:          "var_<id>"
     cgi="auto", index="..."        "var_<id>"
     cgi="keep", variable="<name>"  "var_<name>"
  -->

<!ELEMENT ui:textarea ANY>

<!ATTLIST ui:textarea
          variable  %nametoken;  #REQUIRED
          index     CDATA        #IMPLIED
          rows      CDATA        #IMPLIED
          cols      CDATA        #IMPLIED
          wrap      (off|hard|soft)  "off"
          cgi       (auto|keep)  "auto"
>

<!-- CGI parameters for text areas:
     cgi="auto", no index:          "var_<id>"
     cgi="auto", index="..."        "var_<id>"
     cgi="keep", variable="<name>"  "var_<name>"
  -->

<!ELEMENT ui:a ANY>

<!ATTLIST ui:a
          name  %nametoken;  #REQUIRED
          index CDATA        #IMPLIED
          goto  %nametoken;  #IMPLIED
          cgi   (auto|keep)  "auto"
>


<!-- ui:a: Although a hyperlink, it generates a Button event -->

<!-- CGI parameters for anchors:
     cgi="auto", no index:          "anchor_<id>"
     cgi="auto", index="..."        "xanchor_<id>"
     cgi="keep", name="<name>"      "anchor_<name>"
  -->


<!ELEMENT ui:special ANY>

<!-- ui:special outputs the subnodes as raw HTML. No further ui:* elements
     are recognized (they are discarded).
     To include JavaScript, use:
     <ui:special><![CDATA[
        <script language=javascript>
        ...
        </script>
     ]]>
     </ui:special>
  -->

<!-- ************************************************************ -->

<!-- Conditionals. ui:if, ui:ifvar, ui:iflang expand their contents
     only when a condition holds, otherwise these elements do not
     expand anything.
  -->

<!ELEMENT ui:if ANY>

<!ATTLIST ui:if
	  op CDATA "eq"
>

  <!-- There must also be attributes value1, value2, ... which are the arguments
       of the operation selected by op.
    -->


<!ELEMENT ui:ifvar ANY>

<!ATTLIST ui:ifvar
          variable %nametoken;  #REQUIRED
          index    %nametoken;  #IMPLIED
          value    CDATA        #REQUIRED
          op       CDATA        "eq"
>

  <!-- condition: the variable, optionally the item at the selected
       index, is equal (op="eq"), or not equal (op="ne") to the
       value.
       If you do not need index, and the variable is a string variable,
         <ui:if value1="$[variable]" value2=...>
       means the same and is shorter.
    -->


<!ELEMENT ui:iflang ANY>

<!ATTLIST ui:iflang
	  xml:lang CDATA #REQUIRED>

  <!-- condition: the selected language is xml:lang -->

<!ELEMENT ui:ifexpr ANY>

<!ATTLIST ui:ifexpr
          expr CDATA #REQUIRED>

  <!-- This conditional is evaluated when expr is a non-zero integer -->


<!ELEMENT ui:true ANY>

  <!-- condition: always true -->


<!ELEMENT ui:false ANY>

  <!-- condition: always false -->



<!ELEMENT ui:cond ( (ui:if | ui:ifexpr | ui:ifvar | ui:iflang | ui:true | ui:false)+ )>

  <!-- ui:cond tries the conditions in turn, and expands the first
       matching condition.

       PROBLEM: ui:use (and t:*, q:*) are missing as possible
       conditions. It would be nice to allow them, because templates
       are useful to formulate custom conditions. But these templates
       must fulfill the constraint that they expand to a condition.
    -->

<!-- ************************************************************ -->


<!ELEMENT ui:template ANY>

<!-- actually: ELEMENT ui:template (ui:default*, ANY) -->


<!ATTLIST ui:template
          name               NMTOKEN  #REQUIRED
          from-caller        NMTOKENS #IMPLIED
          from-context       NMTOKENS #IMPLIED
          xml:lang           NMTOKEN  #IMPLIED
>

<!-- Within a template, use $param for (formal) parameters.
     NOTES ON PARAMETER PASSING:
     - Parameters are allowed either within an attribute, or between elements.
       Examples:
       <ui:template name="sample">
         <a href="$url">This is my link</a>
         $further_text
       </ui:template>
     - When a parameter inside an attribute is instantiated, the value is
       "flattened". This means that markup metacharacters and normal
       characters are not distinguished; both kinds of symbols are protected
       by entities if necessary.
       Example:
         If $url="<b>&amp;</b>",
            (i.e. <ui:param name="url"><b>&amp;amp;a</b></ui:param>) then
         <a href="$url">This is my link</a> is expanded to HTML:
         <a href="&lt;b&gt;&amp;amp;&lt;/b&gt;">This is my link</a>
     - Parameters between elements are passed in their internal representation;
       the difference between characters and metacharacters is kept.
       Example:
         if $further_text="<b>&amp;</b>", then
         $further_text   is expanded to HTML:
         <b>&amp;amp;</b>
     - Further instantiations are done only if needed (lazy evaluation).

     - Parameters must be declared. Put them into the from-caller list
       or the from-context list

     - from-caller parameters are passed from the caller by <ui:param>
       elements occuring in the calling <ui:use>, <ui:iterate> or
       <ui:enumerate>. Example:

       <ui:template name="t1" from-caller="x">
         This is $x
       </ui:template>

       Called by:

       <ui:use template="t1">
         <ui:param name="x">a from-caller parameter</ui:param>
       </ui:use>

       It is possible to define default values for this kind of parameter
       (see ui:default).

     - from-context parameters are passed by context. The context is
       extended by ui:context

     - xml:lang: if present, this attribute adds a language suffix to
       the template name. For example,
         <ui:template name="a" xml:lang="en">
       is exactly the same as
         <ui:template name="a#en">
       - however, the character '#' is illegal in the name attribute,
       so you must use xml:lang to get this effect.
  -->


<!ELEMENT ui:default ANY>

<!ATTLIST ui:default
          name     NMTOKEN           #REQUIRED
>

  <!-- <ui:default> specifies a default value for parameters passed
       from-caller.

       Example:

       <ui:template name="t1" from-caller="x">
         <ui:default name="x">the default value</ui:default>
         This is $x
       </ui:template>

       Called by:

       <ui:use template="t1">
       </ui:use>
  -->


<!ELEMENT ui:use ( ui:param )* >

<!ATTLIST ui:use
          template %nametoken; #REQUIRED>

  <!-- Note languages:
       If there is a language variable in the current object, ui:use
       will behave as follows:
       - First, the template with the language suffix is tried. If it
         exists, this template will be expanded.
       - Otherwise, the template without the language suffix will be
         expanded.
    -->


<!ELEMENT ui:context ANY >
  <!-- <ui:context> extends the current context, and it is used as follows:

       <ui:context>
         <ui:param name="n1">...</ui:param>
         <ui:param name="n2">...</ui:param>
         ...
         BODY
       </ui:context>

       The parameters n1,n2... are added to the context when BODY is
       expanded
  -->


<!-- PROPOSAL:
     Erstes innere Element darf auch ein ui:template sein.
  -->

<!ELEMENT ui:iterate ( ( ui:param )*,
                       ( ui:iter-empty )?,
                       ( ui:iter-head )?,
                       ( ui:iter-foot )?,
                       ( ui:iter-separator )?
                     )
 >
<!--  ( ui:inline-template )? -->

<!ATTLIST ui:iterate
          template %nametoken; #REQUIRED
          variable %nametoken; #REQUIRED
          index    CDATA       #IMPLIED
>

<!-- uses the "template" several times.
     The variable must be a dynamic enumerator or an associative variable
     over strings.
     The special parameter "$int" is used for the internal values/keys,
     the special parameter "$ext" for the external values.
  -->


<!ELEMENT ui:enumerate ( ( ui:param )*,
                         ( ui:iter-empty )?,
                         ( ui:iter-head )?,
                         ( ui:iter-foot )?,
                         ( ui:iter-separator )?
                       )
>

<!ATTLIST ui:enumerate
          template %nametoken; #REQUIRED
          type     %nametoken; #IMPLIED
          variable %nametoken; #IMPLIED
          index    CDATA       #IMPLIED
>

<!-- uses the "template" several times. "type" must be a declared enumerator.
     If "variable" is not present, all values of the enumerator are
     enumerated; the param "$int" is the internal value, and
     "$ext" the external value.
     If "variable" is present, only the values stored in this variable
     are enumerated.
     The parameters passed using ui:param are added to
     "$int", and "$ext".
     Either "variable" or "type" must be present; neither both nor none of
     them.
  -->


<!ELEMENT ui:iter-empty ANY>
<!ELEMENT ui:iter-head ANY>
<!ELEMENT ui:iter-foot ANY>
<!ELEMENT ui:iter-separator ANY>

<!-- If the iterator is applied to an empty set, and if ui:iter-empty
     is specified, the contents of ui:iter-empty are printed instead of
     the iterator output.

     Otherwise: Before iteration starts, the contents of ui:iter-head
     are printed (if present). Between every cycle the contents of
     ui:iter-separator are printed. After the iteration, the contents
     of ui:iter-foot are output.
  -->


<!ELEMENT ui:param ANY>

<!ATTLIST ui:param
          name  %nametoken;       #REQUIRED
>


<!-- Standard library -->

<!ELEMENT ui:library (ui:libtemplate)*>

<!ELEMENT ui:libtemplate ANY>

<!ATTLIST ui:libtemplate
          name               NMTOKEN  #REQUIRED
          from-caller        NMTOKENS #IMPLIED
          from-context       NMTOKENS #IMPLIED
          xml:lang           NMTOKEN  #IMPLIED
>

<!-- ui:libtemplate is like ui:template, with the following exception:

     a ui:libtemplate can be overridden by a ui:template with the same
     name
  -->

<?pxp:dtd optional-element-and-notation-declarations?>

<?pxp:dtd optional-attribute-declarations
      elements="ui:form ui:button ui:imagebutton ui:checkbox ui:radio
                ui:file ui:password ui:text ui:select ui:textarea ui:a
                ui:richbutton ui:if"?>


This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml