It's not working in the browsers because of lack of support for XSLT 2.0. As of this date, Internet Explorer and Chrome don't yet have native support for XSLT 2.0. For it towork in these browsers you will have to use Muenchian grouping in XSLT 1.0 to group your log-entries, since XSLT 1.0 doesn't support for-each-group
.
Besides that, your transformation is incorrect because the HTML tags are outside the <xsl:template>
. If you place them inside the template it will work (in a XSLT 2.0 compatible processor):
<xsl:stylesheet version="2.0" ... >
<xsl:template match="/">
<html >
<body> ... </body>
</html>
</xsl:template>
</xsl:stylesheet>
An alternative way of doing the transformation is to use literal result elements. In this case you don't need a full XSLT template. You should place the XSLT namespace and version before you use the XSL tags in your document:
<html xsl:version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<body>
<h2>Change log</h2>
<ul>
<xsl:for-each-group select="log/logentry" group-by="author">
<li><h3><xsl:value-of select="author"/></h3>
<ul>
<xsl:for-each select="current-group()">
<li><xsl:value-of select="msg"/></li>
</xsl:for-each>
</ul>
</li>
</xsl:for-each-group>
</ul>
</body>
</html>