Хотя вы не показали нам желаемый результат преобразования, я считаю, это преобразование может быть полезным :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="text()"/>
<xsl:template match="/">
<characters><xsl:apply-templates/></characters>
</xsl:template>
<xsl:template match="characters/text()" name="split">
<xsl:param name="pText" select="."/>
<xsl:if test="string-length($pText) > 0">
<character name="character">
<xsl:value-of select=
"substring-before(concat($pText, ','), ',')"/>
</character>
<xsl:call-template name="split">
<xsl:with-param name="pText" select=
"substring-after($pText, ',')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Применительно к предоставленному исходному XML-документу :
<fortnight>
<hero>
<name>Guardian</name>
<characters>Bull,Knox,Penny</characters>
<rarities>Rare,Epic,Legendary</rarities>
</hero>
<hero>
<name>Deadly Blade</name>
<characters>Crash,Scorpion</characters>
<rarities>Epic,Legendary</rarities>
</hero>
<hero>
<name>Enforcer</name>
<characters>Grizzly</characters>
<rarities>Uncommon,Rare,Epic,Legendary</rarities>
</hero>
</fortnight>
(наиболее вероятный) требуемый результат получен :
<characters>
<character name="character">Bull</character>
<character name="character">Knox</character>
<character name="character">Penny</character>
<character name="character">Crash</character>
<character name="character">Scorpion</character>
<character name="character">Grizzly</character>
</characters>