Функция EXSLT set:distinct
работает с наборами узлов. Передаваемые ему строки не являются наборами узлов, поэтому эта функция не работает. Вернее, он работает отлично, но вы ожидаете от него необоснованного.
Прежде всего, вы не должны хранить разделенные запятыми списки в XML, если можете помочь. XML уже является форматом с разделителями, поэтому у вас не должно быть никаких причин хранить внутри него формат с разделителями.
Если у вас есть контроль над форматом, вы должны использовать что-то вроде этого:
<categories>
<category>
<LOC>USA</LOC>
<LOC>UK</LOC>
<LOC>Spain</LOC>
</category>
<category>
<LOC>India</LOC>
<LOC>USA</LOC>
<LOC>China</LOC>
</category>
</categories>
Если бы вы указали формат ввода, set:distinct
сработал бы просто так, как вы пытаетесь его использовать.
Если у вас нет этого контроля над форматом ввода, вы обнаружите, что XSLT действительно не подходит для манипулирования строками и токенизации (XSLT 2 более полезен, если у вас есть доступ к нему, как упоминал Джим Гаррисон в комментарий). Лучше всего прочитать XML в какую-то другую структуру и токенизировать содержимое элемента LOC
и напрямую работать с результатами, чем пытаться сделать это в XSLT.