This is a simple XSLT to produce a HTML documentation of an XSD file.

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/10/XMLSchema-instance"
version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<HTML>
<BODY>
<xsl:apply-templates select="//xsd:complexType[@name]">
<xsl:sort select="@name" />
</xsl:apply-templates>
<xsl:apply-templates select="//xsd:simpleType[@name]">
<xsl:sort select="@name" />
</xsl:apply-templates>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="xsd:complexType[@name]">
<h4>
<xsl:value-of select="@name"/>
</h4>
<table border="1" width="600px">
<tr>
<th width="40%">Name</th>
<th width="40%">Type</th>
<th width="20%">Occurance</th>
</tr>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="xsd:simpleType[@name]">
<h4>
<xsl:value-of select="@name"/>
</h4>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="xsd:restriction[@base]">
<ul>
<xsl:for-each select="xsd:enumeration">
<li>
<xsl:value-of select="@value"/>
</li>
</xsl:for-each>
</ul>
</xsl:template>
<xsl:template match="xsd:element">
<xsl:variable name="name" select="@name"/>
<xsl:variable name="type" select="@type"/>
<tr>
<td>
<xsl:value-of select="$name"/>
</td>
<td>
<xsl:value-of select="$type"/>
</td>
<td>
<xsl:choose>
<xsl:when test="not(@maxOccurs)">
<xsl:value-of select="@minOccurs"/>-1
</xsl:when>
<xsl:when test="@maxOccurs=@minOccurs">
<xsl:value-of select="@minOccurs"/>
</xsl:when>
<xsl:when test="@maxOccurs='unbounded'">
<xsl:value-of select="@minOccurs"/>-*
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@minOccurs"/>-<xsl:value-of select="@maxOccurs"/>
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>