Загадка .NET XslTransform - META-кодировка в выводе преобразования - PullRequest
3 голосов
/ 20 мая 2011

У меня есть следующий фрагмент кода:

        using (Stream stream = new MemoryStream())
        {
            xslt.Transform(document, xslArg, stream);
            stream.Seek(0, SeekOrigin.Begin);
            StreamReader reader = new StreamReader(stream);
            var result = reader.ReadToEnd();
            return result;
        }

Это преобразование выводит документ HTML.Что меня удивляет, так это то, что, хотя вход xsl содержит:

        <html>
            <head>
                <style>
                    @page Section1
                    {size:612.0pt 792.0pt;
                    margin:42.55pt 42.55pt 42.55pt 70.9pt;
                    mso-header-margin:35.45pt;
                    mso-footer-margin:35.45pt;
                    mso-paper-source:0;}
                    div.Section1
                    {page:Section1;}
            </head>
            <body>
                <div class="Section1">
                .....

, вывод:

<html xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=utf-8">
    <style>.....

, как вы видите, информация о кодировке была добавлена, помимо прочего.

Но что меня поразило, так это то, что когда я изменил код, который преобразует в:

    StringBuilder sb = new StringBuilder();
    using (StringWriter writer = new StringWriter(sb))
    {
        xslt.Transform(document, xslArg, writer);
    }
    var result = sb.ToString();
    return result;

сгенерированный вывод имел следующую форму:

<html xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=utf-16">
    <style>....

Как вывидно, кодировка изменилась.Я полагаю, это потому, что StringBuilder и .NET по умолчанию работают с использованием UTF-16.Но почему в любом случае преобразование добавляет метатег к charset?

1 Ответ

4 голосов
/ 20 мая 2011

Ну, либо ваша таблица стилей имеет <xsl:output method="html"/>, либо корневой элемент дерева результатов имеет локальное имя html и не находится в пространстве имен.В обоих случаях спецификация XSLT требует, чтобы процессоры XSLT добавляли метаэлемент с типом содержимого и набором символов в разделе заголовка при сериализации дерева результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...