Вы создаете атрибут вот так
<xsl:attribute name="href">
#<xsl:value-of select="$collapseId" />
</xsl:attribute>
Но вы отступили текстовый узел, содержащий #
. Это означает, что это не просто добавление #
к атрибуту, но новая строка и пробелы перед ним.
Измените это на
<xsl:attribute name="href">
<xsl:text>#</xsl:text>
<xsl:value-of select="$collapseId" />
</xsl:attribute>
Разница в том, что XSLT будет игнорировать текстовые узлы "только пробелы", поэтому в этом случае символ новой строки и пробелы не будут выводиться.
Обратите внимание: если бы вы могли использовать XSLT 2.0, вы могли бы сделать это
<xsl:attribute name="href" select="concat('#', $collapseId)" />
Также обратите внимание, что было бы более эффективно объявить переменную collapseId
следующим образом:
<xsl:variable name="collapseId" select="sectiontitle/@pardef"/>