【问题标题】:Is there a way to have browsers ignore or override xml-stylesheet processing instructions?有没有办法让浏览器忽略或覆盖 xml-stylesheet 处理指令?
【发布时间】:2010-10-21 03:18:26
【问题描述】:

我正在尝试编写一个书签,以帮助一些 QA 测试人员在遇到问题时提交有用的调试信息。目前我可以将 window.location 设置为提供此调试信息的 URL,但此资源是一个带有 xml-stylesheet 处理指令的 XML 文档。

如果测试人员能够以纯文本形式查看原始 XML 数据,或者 IE 和 Firefox 的默认 XML 呈现,实际上会更方便。

有人知道使用 Internet Explorer 或 Firefox 禁用或覆盖 XML 文档中提供的 xml-stylesheet 指令的方法吗?

编辑:我在这个问题上开了一个赏金。要求:

  • 仅限客户端代码,不允许用户干预
  • 需要 IE 和 Firefox 的解决方案(它们可以是不同的解决方案)
  • 禁用样式表处理并将其呈现为文本是可以接受的
  • 可以使用自定义 XSL 覆盖样式表处理
  • 可以使用浏览器默认的 XML 样式表呈现 XML

【问题讨论】:

    标签: javascript xml xslt browser bookmarklet


    【解决方案1】:

    编辑:太糟糕了,虽然在预览中看起来一切都很好,但可点击的例子似乎把事情搞砸了……也许历史上的布局是好的。

    我听说 IE 和 Firefox 都支持“view-source:”伪协议,但无法验证 IE。 Mac 上的 Firefox 确实理解它,但 Safari 不理解。

    以下小书签不会触发the XML 中指定的the XSLT transformation。尽管 Firefox 会使用一些颜色来渲染它,但它不会执行它通常用于 XML without any XSLT 的默认转换(因此,view-source 的结果不会产生 Firefox 通常会显示的可折叠文档树):

    javascript:(function(){
      var u = 'http://www.w3schools.com/xsl/cdcatalog_with_ex1.xml';
      var w = window.open();
      w.document.location.href = 'view-source:' + u;
    })()
    

    使用 Ajax 获取文档时,不限于使用 alert oneporter,还可以在新窗口中显示。同样:这不会调用指定的 XSLT 转换:

    javascript:(function(){
      var u = 'http://www.w3schools.com/xsl/cdcatalog_with_ex1.xml';
    
      var w = window.open(); /* open right away for popup blockers */
    
      var x = new XMLHttpRequest();
      x.open('GET', u, true); 
      x.onreadystatechange = function(){
        if(x.readyState == 4){
          w.document.open('text/html');
          /* hack to encode HTML entities */
          var d = document.createElement('div'); 
          var t = document.createTextNode(x.responseText); 
          d.appendChild(t);
          w.document.write('<html><body><pre>' 
              + d.innerHTML + '</pre></body></html>');
          w.document.close();
          w.focus();
        }
      };
      x.send(null); 
    })()
    

    【讨论】:

      【解决方案2】:

      你不能在两个浏览器中都“查看源代码”吗?

      【讨论】:

      • 我不想给测试人员过多的脑力劳动。 :) 但毫不奇怪,这看起来是迄今为止最好的选择。
      • +1 在 IE8 和 Firefox 中,源代码查看器在显示 XML 方面做得非常好。
      • 如果您想更改查看源代码的应用程序(例如,改为 Notepad2),请查看dotnet.org.za/thea/archive/2004/11/25/7933.aspx
      • firefox 源码浏览器也接受 ctrl+r 重新加载页面,可以派上用场。一个巧妙的解决方案是将位置栏放入源浏览器
      【解决方案3】:

      只要您不必处理跨域权限,带有 XML 源的简单 ajax 请求/警报框就可以解决问题。您必须在 xmlHttp 声明中添加一些内容以使其与 IE 兼容。

      <html>
      <body>
      
      <script language="JavaScript">
      function ajaxFunction()
      {
      
      var xmlHttp=new XMLHttpRequest();;
      
        xmlHttp.onreadystatechange=function()
          {
          if(xmlHttp.readyState==4)
            {
            alert(xmlHttp.responseText);
            }
          }
        xmlHttp.open("GET","YOURFILE.xml",true);
        xmlHttp.send(null);
      
      }
      </script>
      
      <a href="#" onclick="JavaScript:ajaxFunction()">Errors</a>
      
      </body>
      </html>
      

      【讨论】:

        【解决方案4】:

        您可以通过在浏览器中输出内容之前使用中间步骤对 XML 进行预处理来避免处理指令。

        客户端建议

        1. 通过 AJAX 请求检索相关的 XML 文档
        2. 将 XML 解析为 DOM(注意:a DOM 不是 DOM)
        3. 遍历 DOM 并在浏览器中呈现所需的数据

        服务器端建议

        不要直接请求相关的 XML 文档,而是向代理脚本发出请求,该脚本会从 XML 内容中删除所有处理指令,或者实际上是所有您不想要的。

        代替:

        window.location = 'http://example.com/document.xml';
        

        使用:

        window.location = 'http://example.com/proxy/';
        


        http://example.com/proxy/ 的脚本将:

        1. 加载document.xml
        2. 使用任何必要的方法从 XML 内容中删除处理指令
        3. 输出 XML 内容

        【讨论】:

        • 您可以通过编写“呈现不同的文档或指向不同的文档”来缩短它。
        【解决方案5】:

        据我所知,没有办法做你想做的事。问题是,javascript 无法从客户端 xml/xsl 转换读取 xml 的 dom。就 javascript 而言,它是在普通的 html dom 上执行的。

        但是,根据 webapp 的类型,可能会有一些希望。您可以使用 ajax 来获取当前 url 的 xml。只要没有发布数据或任何其他随机性,此方法应该可以正常工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-08
          • 1970-01-01
          • 1970-01-01
          • 2011-06-30
          • 2011-09-12
          相关资源
          最近更新 更多