Ошибка при выполнении обработки XML на стороне сервера - PullRequest
2 голосов
/ 26 января 2012

Итак, у меня есть страница aspx, которая отправляет XML + XSL клиенту и выполняет преобразование на стороне клиента, которое работает нормально.

Я пытаюсь определить клиента, и если он не поддерживает преобразование на стороне клиента, я делаю это на стороне сервера. Я прерываю процессор рендеринга aspx-страницей, которая возвращает XML, и я получаю его вывод, объединяя его с выводом со страницы XSL и предоставляя его. Этот вывод, однако, не очень хорошо сформирован. Я получаю

XML Parsing Error: mismatched tag. Expected: </link>.
Location: http://oohrl.com/dashboard.aspx
Line Number 36, Column 20:        </script></head>
-------------------^

В сгенерированном на стороне клиента выводе, который работает нормально, я получаю, например,

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <link rel="stylesheet" type="text/css" href="./css/dboard.css"/>
    <link rel="stylesheet" type="text/css" href="./css/dboardmenu.css"/>
    <script type="text/javascript" src="./js/simpletabs.js"/>
    <link href="../css/simpletabs.css" rel="stylesheet" type="text/css"/>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"/>
    <script type="text/javascript">
                $(document).ready(function () {
                    $("#BlogSelectList li a").live("click", function () {
                        var str = ($(this).attr("href")).slice(1, 37)
                        $.ajax({
                            contentType: "application/json; charset=utf-8",
                            url: '../ws/WebServices.asmx/SetActiveBlog',
                            data: '{ActiveBlogID: "' + str + '"}',
                            dataType: 'json',
                            type: "post",
                            success: function (j) {
                                    window.location.href = 'dashboard.aspx'
                            }

                        });

                    });
                })

        function showlayer(layer) {
            var myLayer = document.getElementById(layer);
            if (myLayer.style.display == "none" || myLayer.style.display == "") {
                myLayer.style.display = "block";
                }
                else {
            myLayer.style.display = "none";
            }
        }

        </script></head>

Если я сгенерирую его на стороне сервера, я получу

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>
      <head>
        <META http-equiv="Content-Type" content="text/html; charset=utf-16">
        <link rel="stylesheet" type="text/css" href="./css/dboard.css">
        <link rel="stylesheet" type="text/css" href="./css/dboardmenu.css">
<script type="text/javascript" src="./js/simpletabs.js"></script>
<link href="../css/simpletabs.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js">
</script>
<script type="text/javascript">
                    $(document).ready(function () {
                        $("#BlogSelectList li a").live("click", function () {
                            var str = ($(this).attr("href")).slice(1, 37)
                            $.ajax({
                                contentType: "application/json; charset=utf-8",
                                url: '../ws/WebServices.asmx/SetActiveBlog',
                                data: '{ActiveBlogID: "' + str + '"}',
                                dataType: 'json',
                                type: "post",
                                success: function (j) {
                                        window.location.href = 'dashboard.aspx'
                                }

                            });

                        });
                    })

                        function showlayer(layer) {
                            var myLayer = document.getElementById(layer);
                            if (myLayer.style.display == "none" || myLayer.style.display == "") {
                                myLayer.style.display = "block";
                            }
                            else {
                                myLayer.style.display = "none";
                            }
                        }


        </script></head>

Что дает мне ошибку. Конечно, я замечаю разницу в теге <link/> против <link>, но я понятия не имею, почему механизм обработки на стороне сервера дает мне другие результаты или как это исправить?

Вот код, который я использую для генерации XHTML на сервере

    protected override void Render(HtmlTextWriter writer)
    {

        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter hWriter = new HtmlTextWriter(sw);
        base.Render(hWriter);
        // *** store to a string
        string XMLOutput = sb.ToString();
        // *** Write it back to the server
        if (!Request.Browser.IsBrowser("IE"))
        {
            writer.Write(XMLOutput);
        }
        else
        {
            StringWriter XSLsw = new StringWriter();
            HttpContext.Current.Server.Execute("DashboardXSL.aspx", XSLsw);
            string output = String.Empty;
            using (StringReader srt = new StringReader(XSLsw.ToString())) // xslInput is a string that contains xsl
            using (StringReader sri = new StringReader(XMLOutput)) // xmlInput is a string that contains xml
            {
                using (XmlReader xrt = XmlReader.Create(srt))
                using (XmlReader xri = XmlReader.Create(sri))
                {
                    XslCompiledTransform xslt = new XslCompiledTransform();
                    xslt.Load(xrt);
                    using (StringWriter _sw = new StringWriter())
                    using (XmlWriter xwo = XmlWriter.Create(_sw, xslt.OutputSettings)) // use OutputSettings of xsl, so it can be output as HTML
                    {
                        xslt.Transform(xri, xwo);
                        output = _sw.ToString();
                    }
                }
            }
            writer.Write(output);
            Response.Flush();
            Response.End();
       }

Ответы [ 2 ]

1 голос
/ 26 января 2012

Поскольку корневым элементом вашего выходного документа является <html>, процессор выбирает HTML в качестве формата по умолчанию. Чтобы создать правильно сформированный документ XHTML, убедитесь, что ваш XSLT содержит следующее как дочерний элемент корневого элемента <xsl:stylesheet> или <xsl:transform>:

<xsl:output method="xml" omit-xml-declaration="yes" />
0 голосов
/ 26 февраля 2012

Мне пришлось установить тип содержимого на листе xsl на text / html, что решило все проблемы.

Обратите внимание, что это изменение используется ТОЛЬКО при преобразовании на стороне сервера. При отправке клиенту для преобразования клиента он не изменяется на text / html

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