Явно проверьте, что узлы имеют содержимое:
<sum><xsl:value-of select="fn:sum(values/value[text()])" /></sum>
Я думаю, что вы упомянули:
<xsl:value-of select="fn:sum(values[value != '']/value)" />
не работает, потому что узел пуст - он вообще не содержит текстового узла, тогда как value != ''
проверяет наличие пустой строки, то есть текстового узла, имеющего данные длины 0.