What you need is this:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="/">
<items>
<xsl:apply-templates select="/blogger/post/categories" />
</items>
</xsl:template>
<xsl:template match="categories">
<xsl:call-template name="split">
<xsl:with-param name="pString" select="." />
</xsl:call-template>
</xsl:template>
<!-- this splits a comma-delimited string into a series of <item>s -->
<xsl:template name="split">
<xsl:param name="pString" select="''" />
<xsl:variable name="vList" select="
concat($pString, ',')
" />
<xsl:variable name="vHead" select="
normalize-space(substring-before($vList ,','))
" />
<xsl:variable name="vTail" select="
normalize-space(substring-after($vList ,','))
" />
<xsl:if test="not($vHead = '')">
<item>
<xsl:value-of select="$vHead" />
</item>
<xsl:call-template name="split">
<xsl:with-param name="pString" select="$vTail" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Which produces this intermediary result:
<items>
<item>Engineering</item>
<item>Internet</item>
<item>Sausages</item>
<item>Internet</item>
<item>Sausages</item>
<item>Sausages</item>
</items>
And this:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="text" />
<xsl:key name="kItem" match="item" use="." />
<xsl:template match="/items">
<xsl:apply-templates select="item">
<xsl:sort
select="count(key('kItem', .))"
data-type="number"
order="descending"
/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="item">
<xsl:if test="
generate-id() = generate-id(key('kItem', .)[1])
">
<xsl:value-of select="
concat(
., ' (', count(key('kItem', .)), ') '
)
" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Which outputs:
Sausages (3)
Internet (2)
Engineering (1)