Example 17-21: Transforming an abstract form description into HTML

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <!--
   | UtilDataForm.xsl: Transform <dataform> structural info
   |                   into a data-bound HTML Form
   +-->
  <xsl:template match="dataform">
    <center>
      <form method="POST" action="{@target}">
        <xsl:for-each select="item[@type='hidden']">
          <input type="hidden" name="{@name}" value="{normalize-space(.)}"/>
        </xsl:for-each>
        <table>
          <xsl:for-each select="item[@type != 'hidden']">
            <tr>
              <th align="right"><xsl:value-of select="@label"/></th>
              <td>
                <xsl:choose>
                  <xsl:when test="@type='text'">
                    <input type="text" name="{@name}"
                                       value="{normalize-space(.)}">
                      <xsl:if test="@size">
                        <xsl:attribute name="size">
                          <xsl:value-of select="@size"/>
                        </xsl:attribute>
                      </xsl:if>
                    </input>
                  </xsl:when>
                  <xsl:when test="@type='textarea'">
                    <textarea class="code" rows="5" name="{@name}">
                      <xsl:if test="@size">
                        <xsl:attribute name="cols">
                          <xsl:value-of select="@size"/>
                        </xsl:attribute>
                      </xsl:if>
                      <xsl:value-of select="normalize-space(.)"/>
                    </textarea>
                  </xsl:when>
                  <xsl:when test="@type='list'">
                    <xsl:variable name="default" select="default"/>
                    <select name="{@name}">
                      <xsl:for-each select="ROWSET/ROW">
                        <option value="{VALUE}">
                          <xsl:if test="VALUE=$default">
                            <xsl:attribute name="selected"/>
                          </xsl:if>
                          <xsl:value-of select="DISPLAY"/>
                        </option>
                      </xsl:for-each>
                    </select>
                  </xsl:when>
                  <xsl:when test="@type='checkboxlist'">
                    <xsl:variable name="name" select="@name"/>
                    <xsl:for-each select="ROWSET/ROW">
                      <input type="checkbox" name="{$name}" value="{VALUE}">
                        <xsl:if test="SELECTED='Y'">
                          <xsl:attribute name="checked"/>
                        </xsl:if>
                      </input>
                      <xsl:value-of select="DISPLAY"/><br/>
                    </xsl:for-each>
                  </xsl:when>
                </xsl:choose>
              </td>
            </tr>
          </xsl:for-each>
        </table>
        <input type="submit" value="{@submit}"/>
      </form>
    </center>
  </xsl:template>
</xsl:stylesheet>