有没有办法让浏览器忽略或覆盖xml样式表处理指令?

时间:2009-04-22 15:20:18

标签: javascript xml xslt browser bookmarklet

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

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

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

以下书签不会触发the XSLT transformation中指定的the XML。虽然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); 
})()

答案 1 :(得分:2)

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

答案 2 :(得分:2)

只要您不必处理跨域权限,使用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>

答案 3 :(得分:1)

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

客户端建议

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

    而不是直接请求相关的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内容

答案 4 :(得分:0)

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

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