<!--
 * 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.
-->
<html>
<head></head>
<body bgcolor=#ffffff>
<hr>

<center><h3>Xalan/XSLTC Applet Demo</h3></center>
Each of these examples illustrate the use of translets
within a Java applet:
<p>

  <script language="JavaScript">

    function run_transform(form) {
      /* Get the input document and translet class name from input form */
      var translet = form.translet.value;
      var doc = form.doc.value;

      /* Get the frame to output to */
      var output_frame = parent.frames.demo_output.document;

      /* Display the output in this frame */
      output_frame.clear();
      output_frame.writeln(document.TransformApplet.transform(translet, doc));
      output_frame.close();
      return(true);
    }

  </script>

  <form name="xslt_form" onSubmit="run_transform(this.form)">
    <p>Select translet:</p>
    <p><input name="translet" width="64"></p>
    <p>Select XML source document:</p>
    <p><input name="doc" width="64"></p>
    <p><input type="button" value="Run" onClick="run_transform(this.form)"></p>

  </form>

  <!--
    The xsltc.jar file must contain the XSLTC runtime classes and your
    pre-compiled translets, as described in the README.applet file.
  -->
  <applet archive="mytranslet.jar, xsltcapplet.jar, xalan.jar, xml-apis.jar, xercesImpl.jar"
          code="TransformApplet"
          name="TransformApplet"
          width="10"
          height="10">
  </applet>

</body>
