В вашем примере все языки дополняются пробелами в тексте
<language> c java ruby </language>
Можете ли вы предположить, что так будет всегда, или вы получите language elements, как так?
<language>c java ruby</language>
В этом случае объединение всех элементов языка приведет к появлению такой строки, которая показывает семь слов
c java rubyc javac++ javapascal javajava ruby
Чтобы справиться с этой ситуацией, вам, вероятно, потребуется сопоставить элемент языка и вернуть строку, за которой всегда следует пробел.
Попробуйте это XSLT ...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="languagelist">
<xsl:apply-templates select="//language"/>
</xsl:variable>
<!-- Count the number of words by counting the number of spaces -->
Count:<xsl:value-of select="string-length($languagelist) - string-length(translate($languagelist, ' ', ''))" />
</xsl:template>
<!-- Return the normalised string with one space at the end -->
<xsl:template match="language">
<xsl:value-of select="concat(normalize-space(.), ' ')" />
</xsl:template>
</xsl:stylesheet>
Обратите внимание, что метод подсчета количества слов заключается в сравнении длины нормализованной строки (с одиночными пробелами) с длиной строки без пробелов. (т.е. посчитать количество пробелов)