This is partial to do with XSLT's built-in templates. These are templates that are used when it can't find a specific template to match a node in your stylesheet. The built-in templates will output the text of any text node is matches, otherwise it will simply skip over the node and carry on processing its children.
The issue arises because of this template
<xsl:template match="artista">
<b>
<xsl:value-of select="nome" /> :
</b>
<xsl:apply-templates />
<br />
<br />
</xsl:template>
In particular, the line <xsl:apply-templates />
. This will look for templates that match the child nodes of the current artista element, which in your case are nome and albums, neither of which have matching templates in your XSLT. Thus the built-in templates apply, and in the case of the nome element, the text within it will be output, which is where the duplicate text comes from.
There are two possible, simple, solutions. Firstly, you can this template to your XSLT to match nome in your XSLT, and ignore it, to prevent the built-in template applying:
<xsl:template match="nome" />
The second solution is to remove the current <xsl:value-of select="." />
from the artista template, and instead have a template matching nome that outputs the value there. Try this XSLT as an example of this
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<xsl:apply-templates />
</html>
</xsl:template>
<xsl:template match="artista">
<xsl:apply-templates />
<br />
<br />
</xsl:template>
<xsl:template match="album">
<xsl:value-of select="titolo" />
</xsl:template>
<xsl:template match="nome">
<b>
<xsl:value-of select="." /> :
</b>
</xsl:template>
</xsl:stylesheet>