This is because XSLT has built-in template rules. These are templates that used by XSLT if it can't find a matching template for a node in your XSLT. For elements (and the document node) the built-in template will not output it, but look for templates that match its children. For a text node, it will output the text.
In your XSLT, you start off by doing this
<xsl:apply-templates />
This will cause XSLT to look for templates that match the children of the document node, which is this case is listacd. As you don't have a template matching this, the built-in templates are used. They will continue to be used to match artista and then nome where the text is then output.
One solution, is to replace the <xsl:apply-templates />
with this, to explicitly tell XSLT what elements to look for.
<xsl:apply-templates select=".//album"/>
Alternatively, keep <xsl:apply-templates />
and add a template that matches text() nodes, and ignores then, rather than letting the built-in template process them.
<xsl:template match="text()" />
For example, try this XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="artista/albums/album">
<xsl:value-of select="titolo"/>
<br/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
Bonus points for the choice of music in your XML, by the way!