我已经看到很多关于这个的帖子......但是我不能,因为我的生活,弄清楚我的问题是什么!当我尝试使用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,但它没有帮助。我在这里做错了什么?
答案 0 :(得分:15)
这不起作用的原因是由于Chrome以一种有争议的方式解决了安全问题 [1] [2] [3] [4] ,阻止XML文件访问同一目录中的本地XSLT文件,而HTML文件可以访问同一目录中的.CSS文件。
Chrome团队在2008年提出的理由是this:
想象一下这种情况:
您收到来自攻击者的电子邮件,其中包含您下载的网页作为附件。
您可以在浏览器中打开现在的本地网页。
本地网页的来源为https://mail.google.com/mail/。
由于您已登录Gmail,因此相框会在收件箱中加载消息。
本地网页使用JavaScript访问框架[0] .document.documentElement.innerHTML来读取框架的内容。 (互联网网页无法执行此步骤,因为它来自非Gmail来源;同源策略会导致读取失败。)
本地网页将收件箱的内容放入a并通过表单POST将数据提交给攻击者的Web服务器。现在,攻击者拥有您的收件箱,这可能对发送垃圾邮件或识别盗窃非常有用。
Gmail无法阻止此次攻击。
我确实同意这很烦人,作为修复你有2个解决方案:
尝试使用--allow-file-access-from-files
开关运行chrome(我自己没有测试过)
将其上传到主机,一切都会好的。
答案 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>
答案 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);