XSL无法在Google Chrome中使用

时间:2010-12-29 21:48:24

标签: xml google-chrome xslt

我已经看到很多关于这个的帖子......但是我不能,因为我的生活,弄清楚我的问题是什么!当我尝试使用XSL转换XML时,Google Chrome只会显示一个空白页面。当我查看源代码时,我看到了原始XML。 IE工作。

我有一个看起来像这样的XML文档......

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="http://localhost/xsl/listXSL.php"?>
<links>
  <link id="1" name="Google Home Page" url="http://www.google.com/" clicks="0" />
  <link id="2" name="Facebook" url="http://www.facebook.com/" clicks="1" />
  <link id="3" name="Gmail" url="http://gmail.com" clicks="2" />
</links>

...然后链接的XSL文件看起来像这样......

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <xsl:for-each select="links/link">
    <a>
        <xsl:attribute name="href">
            <xsl:value-of select="@url" />
        </xsl:attribute>
        <xsl:value-of select="@name" />
    </a><br />
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

您可能会注意到XSL文件实际上是一个PHP文件,但这在其他浏览器中工作正常,我尝试将其更改为.xsl for Chrome,但它没有帮助。我在这里做错了什么?

6 个答案:

答案 0 :(得分:15)

这不起作用的原因是由于Chrome以一种有争议的方式解决了安全问题 [1] [2] [3] [4] ,阻止XML文件访问同一目录中的本地XSLT文件,而HTML文件可以访问同一目录中的.CSS文件。

Chrome团队在2008年提出的理由是this


想象一下这种情况:

  1. 您收到来自攻击者的电子邮件,其中包含您下载的网页作为附件。

  2. 您可以在浏览器中打开现在的本地网页。

  3. 本地网页的来源为https://mail.google.com/mail/

  4. 由于您已登录Gmail,因此相框会在收件箱中加载消息。

  5. 本地网页使用JavaScript访问框架[0] .document.documentElement.innerHTML来读取框架的内容。 (互联网网页无法执行此步骤,因为它来自非Gmail来源;同源策略会导致读取失败。)

  6. 本地网页将收件箱的内容放入a并通过表单POST将数据提交给攻击者的Web服务器。现在,攻击者拥有您的收件箱,这可能对发送垃圾邮件或识别盗窃非常有用。

  7. Gmail无法阻止此次攻击。


    我确实同意这很烦人,作为修复你有2个解决方案:

    1. 尝试使用--allow-file-access-from-files开关运行chrome(我自己没有测试过)

    2. 将其上传到主机,一切都会好的。

答案 1 :(得分:5)

为我上传到主机soves问题。 --allow-file-access-from-files开关解决方案对我不起作用。

答案 2 :(得分:2)

在较旧版本的Chrome中,如果您没有输出具有已知词汇表(HTML,XHTML,SVG等)的正确文档,则无法获得呈现的页面。

在现代版本中(我安装了10.0.612.3 dev),您将获得一个无样式的XML文档(由于多个根元素结果,在您的情况下会出现解析错误)。

解决方案:输出正确的(带有所有必需元素)HTML 4.0文档,或者输出正确的(也使用正确的命名空间)XHTML 1.0文档。

答案 3 :(得分:0)

使用--allow-file-access-from-files开关可以解决这个问题。

我试图在我的系统上使用已安装软件的离线文档。 IE仅通过请求允许启用内容来显示内容。我想说这可以添加到chrome中而不会牺牲安全性。

答案 4 :(得分:0)

我可以通过将xml作为变量存储在javascript中将xml内容加载到chrome中的html中,如下所示。

<html>
<head>testing</head>

<body>
<span id="num"></span> <span id="street"></span><br /> <span id="city"></span>, <span id="state"></span> <span id="zip"></span>

<script>
txt="<address>"+
 "<street>Roble Ave</street>"+
  "<mtfcc>S1400</mtfcc>"+
  "<streetNumber>649</streetNumber>"+
  "<lat>37.45127</lat>"+
  "<lng>-122.18032</lng>"+
  "<distance>0.04</distance>"+
  "<postalcode>94025</postalcode>"+
  "<placename>Menlo Park</placename>"+
  "<adminCode2>081</adminCode2>"+
  "<adminName2>San Mateo</adminName2>"+
  "<adminCode1>CA</adminCode1>"+
  "<adminName1>California</adminName1>"+
  "<countryCode>US</countryCode>"+
 "</address>";

if (window.DOMParser)
  {
  parser=new DOMParser();
  xmlDoc=parser.parseFromString(txt,"text/xml");
  }
else // Internet Explorer
  {
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async=false;
  xmlDoc.loadXML(txt);
  }
document.getElementById("num").innerHTML=
xmlDoc.getElementsByTagName("streetNumber")[0].childNodes[0].nodeValue;
document.getElementById("street").innerHTML=
xmlDoc.getElementsByTagName("street")[0].childNodes[0].nodeValue;
document.getElementById("city").innerHTML=
xmlDoc.getElementsByTagName("adminName2")[0].childNodes[0].nodeValue;
document.getElementById("state").innerHTML=
xmlDoc.getElementsByTagName("adminCode1")[0].childNodes[0].nodeValue;
document.getElementById("zip").innerHTML=
xmlDoc.getElementsByTagName("postalcode")[0].childNodes[0].nodeValue;
</script>
</body>
</html>

screenshot this answer helped me

答案 5 :(得分:0)

到这里开始!实际上非常易于使用。您是否要在 标签上使用它?那不行它必须是body标签的子元素。

var xsltProcessor = new XSLTProcessor();
var myXMLHTTPRequest = new XMLHttpRequest();
myXMLHTTPRequest.open("GET", "chatxml.xsl", false);
myXMLHTTPRequest.send(null);

xslStylesheet = myXMLHTTPRequest.responseXML;
xsltProcessor.importStylesheet(xslStylesheet);


// load the xml file, example1.xml
myXMLHTTPRequest = new XMLHttpRequest();
myXMLHTTPRequest.open("GET", "44f683a84163b3523afe57c2e008bc8c.xml", false);
myXMLHTTPRequest.send(null);
xmlDoc = myXMLHTTPRequest.responseXML;

var fragment = xsltProcessor.transformToFragment(xmlDoc, document);

document.innerHTML = fragment;
console.log();
document.getElementById("c").appendChild(fragment);