Generic XSLT to tabluate XML
Here's a refinement of the solution from @ABach, which attempts to create nested tables:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<table>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="*">
<tr>
<td>
<p><xsl:value-of select="name()"/></p>
</td>
<td>
<p><xsl:value-of select="."/></p>
</td>
</tr>
</xsl:template>
<xsl:template match="*[*]">
<tr>
<td>
<p><xsl:value-of select="name()"/></p>
</td>
<td>
<table>
<xsl:apply-templates/>
</table>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
I haven't attempted to do anything very clever with mixed content.
I've added a bit of CSS to the excellent solution from Michael Kay, if anyone is looking for a quick way to make some XML readable in a browser:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<style>
body {font-family: sans-serif;}
td {padding: 4px;}
</style>
<table>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="*">
<tr>
<td style="background-color: #aaa;">
<p><xsl:value-of select="name()"/></p>
</td>
<td style="background-color: #ccc;">
<p><xsl:value-of select="."/></p>
</td>
</tr>
</xsl:template>
<xsl:template match="*[*]">
<tr>
<td style="border:2px solid #c55; font-size:120%;">
<p><xsl:value-of select="name()"/></p>
</td>
<td style="">
<table>
<xsl:apply-templates/>
</table>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>