Необходимо понимать, что XSL-преобразование применяется не к самому XML-документу, а к древовидному представлению этого документа (-ов). Текстовые узлы содержат значения в определенной кодировке независимо от того, как они были представлены во входном документе - после построения дерева они одинаковы. Во время преобразования вы просто создаете другое дерево, а затем оно сериализуется.
Некоторые символы, подобные тем, которые вы упомянули, требуют особой обработки в зависимости от выбранного формата назначения. В случае сериализации в XML-документ они «экранируются», а в случае сериализации в HTML - нет. Вот почему первый ответ дает вам обходной путь.
Однако разница между этими двумя методами в отношении экранирования заключается только в значении по умолчанию для атрибута " disable-output-escaping " (XSLT 1.0). В случае вывода XML он имеет значение «нет», а в случае HTML - «да».
Таким образом, чтобы исправить вашу проблему без изменения всего метода сериализации, вы можете написать что-то вроде этого, когда копируете какое-то значение, которое может содержать «специальные» символы:
<xsl:value-of select="/my/node/text()" disable-output-escaping="yes"/>
P.S. В XSLT 2.0 предпочтительный способ сделать это - использовать инструкцию отображения символов.