<!doctype HTML public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
	  <title>Untitled</title>
  </head>
  <script language="JavaScript">

    
    function writeSource(sourceString)
    {

      var escString=document.xslControl.escapeString(sourceString);
      var title="XML Source Doc";
      var doc=top.frames[1].document;      
      doc.open();
      doc.write("<h3>" + title + "</h3>");
      doc.write("<PRE>");
      doc.write(escString);
      doc.write("</PRE>");
      doc.close();    
    }
  
    function writeStylesheet(styleString)
    {
      var escString=document.xslControl.escapeString(styleString);
      var title="XSL Stylesheet";
      var doc=top.frames[2].document;          
      doc.open();
      doc.write("<h3>" + title + "</h3>");
      doc.write("<PRE>");
      doc.write(escString);
      doc.write("</PRE>");
      doc.close();     
    } 

    function writeTarget(targetString)
    {
      var doc=top.frames[3].document;
      doc.open();
      var title="HTML Output";      
      doc.write("<h3>" + title + "</h3>");
      if (document.xmlTransform.displayMode[0].checked) //display HTML
      {
        doc.write(targetString);
      }
      else // display source
      {
        var escString=document.xslControl.escapeString(targetString);
        doc.write("<PRE>");
        doc.write(escString);
        doc.write("</PRE>");
      }
      doc.close();    
    }
  
    function clearFrames()
    {
      document.xslControl.freeCache();
      for (i=1; i<4; i++)
        {
        var doc=top.frames[i].document;
        doc.open();
        doc.clear();
        doc.close();
        }
    }
  
    function transform()
    {  
      clearFrames();
      var xmlSource=document.xmlTransform.xmlSourceList.options[document.xmlTransform.xmlSourceList.selectedIndex].value;
      document.xslControl.setDocumentURL(xmlSource);
      var sourceString=document.xslControl.getSourceTreeAsText();
      var styleString=document.xslControl.getStyleTreeAsText();
      var targetString=document.xslControl.getHtmlText();      
      writeSource(sourceString);
      writeStylesheet(styleString);
      writeTarget(targetString);
    }
  </script>
  <body onLoad="clearFrames();" bgcolor="#808080" text="#ffffff">
    <form name="xmlTransform" action="" method="POST">
      <h2><img border="0" hspace="0" vspace="0" align="left" src="rabbitwhorn.jpg">&nbsp;Transform XML Document</h2>
        <table>
          <tr>
            <td width="50"></td>
            <td align="center"><i>Document to transform</i></td>
            <td align="center"><i>Display output as</i></td>
          </tr>
          <tr>
          <td></td>
          <td align="center">
            <select name="xmlSourceList">
              <option value="xalanApplets.xml" selected>&nbsp;xalanApplets.xml&nbsp;
              <option value="foo-s1.xml">&nbsp;foo-s1.xml&nbsp;
            </select>
          </td>
          <td align="center">
            <input type="radio" name="displayMode" checked>HTML&nbsp;&nbsp;
            <input type="radio" name="displayMode">HTML Source
          </td>
          <td>&nbsp;&nbsp;&nbsp;&nbsp;
            <input type="button" name="transformButton" value="Transform" 
            onClick="transform();">
          </td>
        </tr>
      </table>
    </form>
    <!-- Be sure you have applet archive attribute set
         so the applet can find xalan.jar,xml-apis.jar, and xercesImpl.jar (for Xerces-J2) 
         or xerces.jar (for Xerces-J1)-->  
    <applet  
      name="xslControl"
      code="org.apache.xalan.client.XSLTProcessorApplet.class"
      archive="../../bin/xalan.jar,../../bin/xml-apis.jar,../../bin/xercesImpl.jar,../../bin/xerces.jar"
      height="0"
      width"0">
      <param name="documentURL" value="xalanApplets.xml"/>  <!--default setting-->
      <param name="styleURL" value="s1ToHTML.xsl"/> <!--doesn't change-->
    </applet>
  </body>
</html>
