2010-02-18 76 views
0

我有一个XML文档(在.net C#Web应用程序中),我想以简单的形式(类似于IE)显示它。我需要它独立于浏览器(或尽可能),并具有一致的显示。用于将XML显示为HTML的XSLT

我曾尝试将xml文档推送为“text/xml”,这是不一致的,并且在某些浏览器中不起作用。

http://sources.redhat.com/ml/xsl-list/2002-02/msg00831.html 此处的链接提供了一种使用样式表将XML转换为HTML/XHTML的好方法。 但是,提供的样式表不起作用。

第一:这是最好的方法吗?有更好的解决方案吗?第二:如果没有,是否有人知道我在哪里可以找到XSLT?编辑(澄清):我提到的XSLT将把XML转换为XML文件的Internet Explorer风格显示。

在此先感谢! :)

回答

3

我决定我的最佳方法(针对我的情况)是编写2个简单的C#方法来从服务器端的XML生成HTML。这有助于减少对浏览器中显示XML的依赖(Opera是疯了!)

(本例中使用非常简单的格式,这是罚款,我的处境。 我松散建模的IT XML的IE浏览器的显示屏上。 对于他人参考,这里有方法:

 /// <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(); 
    } 
+0

感谢大家的帮助,这是一个有趣的调查! – Russell 2010-02-19 02:41:14

+1

谢谢!这正是我正在寻找的。我刚刚添加了内容(就在打印子节点之上...) //添加内容(如果没有任何子标签) if(element.InnerText == element。InnerXml) returnHTML.AppendLine(“

" + element.InnerText + "
”); – 2011-06-28 09:26:07

0

我要测试,但我发现这个链接:

here

编辑:发现了只能IE.grr室内用的(一些)vresions!

1

您试图使用的样式表仅适用于现代浏览器,不适用于任何版本的IE。在现代浏览器中做这样的事情是微不足道的,但在IE中,您需要通过JavaScript和.NET调用MSXML,以便为其他更现代的浏览器(Firefox,Safari,Chrome,Opera,K-Meleon,Konqueror ,Epiphany,Flock ....你明白了)。这是IE未能实现XHTML所导致的问题的一部分,实质上,这就是你想要做的和其他浏览器所做的事情。

我会在早上检查,如果你还没有解决这个问题,我使用的JavaScript。

+0

感谢罗布 - 我想我会创造我的元素一个简单的XSL特别是如果我不能找到这个乌托邦式的文件这将是伟大的,是能够模拟天生该显示器与。 JQuery和CSS应该是可以做到的 – Russell 2010-02-18 04:20:35

+0

原来,我被告知我无法给出那个js代码,因为我无法理解,但是这个链接是我发现如何去做的这: http://msdn.microsoft.com/en-us/library/ms762796(VS.85).aspx 和 http://msdn.microsoft.com/en-us/library/ms753804(VS。 85).aspx 我会在与某人辩论后再给我实际的代码。 – Rob 2010-02-18 14:47:31