XSLT для отображения XML как HTML - PullRequest
0 голосов
/ 18 февраля 2010

У меня есть документ XML (в веб-приложении .net C #), который я хочу отобразить в его упрощенной форме (аналогично IE). Мне нужно, чтобы он был независимым от браузера (или насколько это возможно) и имел постоянное отображение.

Я пытался протолкнуть xml-документ как "text / xml", но это противоречиво и не работает в некоторых браузерах.

http://sources.redhat.com/ml/xsl-list/2002-02/msg00831.html Ссылка здесь предоставила хороший способ преобразования XML в HTML / XHTML с использованием таблиц стилей. Однако предоставленная таблица стилей не сработала.

Во-первых: это лучший способ сделать это? Есть ли лучшие решения? Второе: если нет, кто-нибудь знает, где я могу найти XSLT?

EDIT (уточнение): XSLT, на который я ссылаюсь, преобразует XML в отображение XML-файлов в стиле Internet Explorer.

Заранее спасибо! :)

Ответы [ 3 ]

3 голосов
/ 19 февраля 2010

Я решил, что мой лучший подход (для моей ситуации) - написать 2 простых метода C # для генерации HTML из XML на стороне сервера. Это помогает уменьшить зависимость от отображения в браузере XML (Opera is Crazy!)

(В этом примере используется довольно простое форматирование, что хорошо для моей ситуации. Я свободно смоделировал это на IE в отображении XML. Для других, вот методы:

        /// <summary>
    /// Does a simple convert to display an Xml document in HTML.
    /// </summary>
    /// <param name="xmlString"></param>
    private static string ConvertXmlToHtml(string xmlString)
    {
        StringBuilder html = new StringBuilder();

        html.AppendLine("<HTML>");
        html.AppendLine("<HEAD><TITLE>Xml Document</TITLE></HEAD>");

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlString);

        html.AppendLine(ConvertXmlElementToHTML(1, doc.DocumentElement));

        html.AppendLine("</HTML>");


        return html.ToString();
    }

    /// <summary>
    /// Converts an XML element (and all of its children) to HTML.
    /// This is a recursive method.
    /// </summary>
    /// <param name="element"></param>
    /// <returns></returns>
    private static string ConvertXmlElementToHTML(int level, XmlNode element)
    {
        int padding = level; // padding (cm == level).

        StringBuilder returnHTML = new StringBuilder();
        if (element is XmlElement)
        {
            // Formatting for symbols to simplify code below.
            string close_bracket = "<SPAN style=\"color: blue\">&gt;</SPAN>";
            string close_bracket_no_children = "<SPAN style=\"color: blue\"> /&gt;</SPAN>";
            string open_bracket = "<SPAN style=\"color: blue\">&lt;</SPAN>";
            string open_bracket_end_el = "<SPAN style=\"color: blue\">&lt;/</SPAN>";
            string el_name = "<SPAN style=\"color: brown\">" + element.Name + "</SPAN>";
            string quote = "<SPAN style=\"color: blue\">\"</SPAN>";
            string equals_sign = "<SPAN style=\"color: blue\">=</SPAN>";

            // Open Element.
            returnHTML.AppendLine("<DIV style=\"margin-left: " + padding + "cm\">" + open_bracket + el_name);

            // Print element attributes.
            foreach(XmlAttribute att in element.Attributes)
            {
                returnHTML.AppendLine(" <SPAN style=\"color: brown\">" + att.Name + "</SPAN>" + equals_sign + quote + "<SPAN style=\"color: black; text-weight: bold\">" + att.Value + "</SPAN>" + quote);
            }

            // If no children, we end the element here with a '/ >'
            // otherwise, we close the element and start to write children '>'
            if (element.ChildNodes.Count == 0)
            {
                returnHTML.AppendLine(close_bracket_no_children + "</DIV>");
            }
            else
            {
                returnHTML.AppendLine(close_bracket + "</DIV>");
            }

            // Print Children. (Recursive call). Note location is IMPORTANT: we need child elements
            // to print after the element is opened and before the element is closed.
            foreach (XmlNode child in element.ChildNodes)
            {
                returnHTML.AppendLine(ConvertXmlElementToHTML(level + 1, child));
            }

            // If we have printed child elements, we need to print a closing element tag.
            if (element.ChildNodes.Count > 0)
            {
                returnHTML.AppendLine("<DIV style=\"margin-left: " + padding + "cm\">" + open_bracket_end_el + el_name + close_bracket + "</DIV>");
            }
        }

        // Return a string of HTML that will display elements at this level and below (child nodes).
        return returnHTML.ToString();
    }
1 голос
/ 18 февраля 2010

Таблица стилей, которую вы пытаетесь использовать, работает только в современных браузерах и не будет работать ни в одной версии IE.Делать такие вещи в современных браузерах тривиально, но в IE вам нужно вызывать MSXML через javascript и .NET, чтобы сделать те же преобразования, что и в других гораздо более современных браузерах (Firefox, Safari, Chrome, Opera, K-Meleon, KonquerorБогоявление, Флок .... вы поняли).Это все часть проблемы, которую IE вызывает из-за того, что не внедряет XHTML, что, по сути, именно то, что вы хотите делать, и любой другой браузер делает.

Я вернусь утром, если вы все еще не решилиэто с помощью JavaScript, который я использую.

0 голосов
/ 18 февраля 2010

Я собираюсь проверить это, но нашел ссылку:

здесь

РЕДАКТИРОВАТЬ: Обнаружено работает только с (некоторые) версии IE.grr!

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