Нельзя сделать в стандартном XSLT.
Входной XML, который вы получаете,
<media:keywords>keyword1,keyword2<![CDATA[keyword3]]></media:keywords>
неотличимо (от XSLT) от
<media:keywords>keyword1,keyword2keyword3</media:keywords>
потому что разметка CDATA - это просто способ экранирования данных внутри нее. В этом случае нет особой разметки, которую нужно экранировать, поэтому CDATA оказывается неактивным. Но XSLT не имеет возможности узнать, какие данные были первоначально выражены с использованием CDATA, что было выражено с использованием символьных сущностей и т. Д.
Решением было бы сообщить тем, кто предоставляет этот XML, что им необходимо поместить разделитель между keyword2 и keyword3.