Not a bad start. I would be inclined to use <xsl:apply-templates/> in places where you have used xsl:for-each or xsl:value-of select=".". That's especially with "document-oriented XML" where elements in the input document may occur in unexpected places. For example, tables might be nested one inside another.
So instead of
<xsl:template match="/">
<body>
<xsl:for-each select="w:wordDocument/w:body//w:tbl">
<table>
<xsl:for-each select="w:tr">
<row>
<xsl:for-each select="w:tc">
<cell>
<xsl:value-of select="."/>
</cell>
</xsl:for-each>
</row>
</xsl:for-each>
</table>
</xsl:for-each>
</body>
</xsl:template>
you want something more like:
<xsl:template match="*">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text()">
</xsl:template>
<xsl:template match="/">
<body>
<xsl:apply-templates/>
</body>
</xsl:template>
<xsl:template match="w:tbl">
<table>
<xsl:apply-templates/>
</table>
</xsl:template>
and so on.
One other point:
<xsl:template match="//w:t">
appears in the email version of your posting but not in the forum version (how did you manage that???). Better to write match="w:t". Both match a w:t element anywhere in the document (the // is redundant). But the "//" changes the default priority of the rule, which can cause unexpected bugs if there are multiple rules that match the same elements.
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference