Вы можете попробовать этот безобразный хак, который доказал свою эффективность снова и снова:
<xsl:for-each select="//*[position() <= string-length(MyData/MyValue)]">
<someTags>
<xsl:value-of select="substring(MyData/MyValue, position(), 1)"/>
</someTags>
</xsl:for-each>
Это будет работать, если //*
соответствует большему количеству узлов, чем количество символов в вашей строке ... Конечно, это также заслуживает нечетной строки комментария для бедняги, читающего ваш код впоследствии ... ;-)
Примечание : Я знаю, что есть пуристы XSLT. Но когда вам нужно выполнить работу и не беспокоиться о гипербодальности XSLT, то иногда эти трюки просто потрясающие! IMO
Также обратите внимание : я поднял здесь вопрос производительности, чтобы узнать, насколько лучше работает итерация или рекурсия: производительность итерации или рекурсии XSLT