Обратите внимание, что XML является одновременно моделью данных и форматом сериализации. Данные могут использовать набор символов, отличный от сериализации этих данных.
Похоже, что основной причиной вашей проблемы является то, что ваш процесс сериализации пытается ограничить набор символов модели данных, тогда как вы хотели бы установить набор символов формата сериализации. Давайте рассмотрим пример: <band>Motörhead</band>
и <band>Motörhead</band>
- это равные XML-документы. Они имеют одинаковую структуру и точно такие же данные. Из-за умного хэви-метала набор символов data является Unicode (или что-то большее, чем ASCII), но, поскольку используется ссылка на символ ö
, набор символов из последней формы сериализации документа является ASCII. Чтобы обработать эти данные, ваши инструменты XML по-прежнему должны поддерживать Unicode в обоих случаях, но при использовании последней сериализации инструменты ввода-вывода и передачи файлов не обязательно должны распознавать Unicode.
Я предполагаю, что, сказав XMLTextWriter
использовать кодировку Windows-1251, он, вероятно, на практике пытается ограничить набор символов данных символами, содержащимися в Windows-1251, отбрасывая все символы вне этого набора символов и вместо них пишется ?
.
Однако, поскольку вы создаете свой XML-документ с помощью XSL-преобразования, вы можете управлять набором символов сериализации непосредственно в вашем XSLT-документе. Это делается путем добавления атрибута кодирования в элемент xsl: output. Измените его так, чтобы он выглядел следующим образом
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" encoding="windows-1251"/>
Теперь процессор XSLT заботится о сериализации для сокращенного набора символов и выводит ссылку на символ для всех символов в данных, которые включены в windows-1251.
Если изменение набора символов данных действительно то, что вам нужно, то вам нужно обработать данные с помощью подходящей библиотеки преобразования символов, которая может угадать наиболее подходящий заменяющий символ (например, ö
-> o
).