It appears to be because fname contains text which is not a valid element name (can't contain a space). Try the following, but keep in mind there could other cases you need to address, depending on your data.
<xsl:template match="faculty">
<xsl:element name="{translate(fname, ' ', '_')}">
<xsl:for-each select="students/name">
<name>
<xsl:value-of select="."/>
</name>
</xsl:for-each>
</xsl:element>
</xsl:template>