XSL не работает в Google Chrome
Я видел много сообщений обо всем этом... но я не могу, для жизни меня, выяснить, что моя проблема! Google Chrome просто показывает пустую страницу, когда я пытаюсь преобразовать XML с помощью XSL. Когда я рассматриваю источник, я вижу необработанный XML. IE работает.
У меня есть XML-документ, который выглядит так...
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="#" onclick="location.href='http://localhost/xsl/listXSL.php'; return false;"?>
<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 для Chrome, но это не помогает. Что я здесь делаю неправильно?
Ответы
Ответ 1
Причина, по которой это не работает, связана с проблемой безопасности, с которой Chrome обратился спорным образом [1] [2] [3] [4] блокируя XML файлы от доступа к локальным файлам XSLT в том же каталоге, в то время как файлы HTML могут получить доступ к файлам .CSS в том же каталоге, что и просто.
Обоснование, данное командой Chrome в 2008 году, было this:
Представьте себе этот сценарий:
-
Вы получаете сообщение электронной почты от злоумышленника, содержащего веб-страницу в качестве вложения, которое вы загружаете.
-
Вы открываете локальную веб-страницу в своем браузере.
-
Локальная веб-страница создает источник, https://mail.google.com/mail/.
-
Поскольку вы вошли в Gmail, кадр загружает сообщения в ваш почтовый ящик.
-
Локальная веб-страница считывает содержимое фрейма с помощью JavaScript для доступа к фреймам [0].document.documentElement.innerHTML. (Веб-страница в Интернете не сможет выполнить этот шаг, потому что она исходит из источника, отличного от Gmail, политика с одинаковым исходным кодом приведет к сбою чтения.)
-
Локальная веб-страница помещает содержимое вашего почтового ящика в и отправляет данные через форму POST на веб-сервер злоумышленника. Теперь у злоумышленника есть ваш почтовый ящик, который может быть полезен для рассылки спама или идентификации кражи.
Gmail не может защитить себя от этой атаки.
Я согласен, что это раздражает, поскольку у вас есть 2 решения:
-
Попробуйте запустить chrome с помощью переключателя --allow-file-access-from-files
(я сам этого не тестировал)
-
Загрузите его на хост, и все будет хорошо.
Ответ 2
Загрузка на проблему с хостами для меня. Решение -allow-file-access-from-files не работает для меня.
Ответ 3
В старой версии Chrome, если вы не выведете правильный документ с известным лексиконом (HTML, XHTML, SVG и т.д.), вы не получите отображаемую страницу.
В современной версии (у меня установлен 10.0.612.3 dev
) вы получаете нестандартный XML-документ (с ошибкой синтаксического анализа в вашем случае из-за более чем одного результата корневого элемента).
Решение. Выведите правильный (со всеми обязательными элементами) документ HTML 4.0 или правильный (также с правильным пространством имен) документ XHTML 1.0.
Ответ 4
Использование переключателя "allow-file-access-from-files" делает трюк для меня.
Я пытался использовать автономную документацию из установленного программного обеспечения в своей системе. IE показывал контент, только запрашивая разрешение на включение содержимого. Я бы сказал, что это можно добавить и в хром, не жертвуя безопасностью.
Ответ 5
Мне удалось загрузить содержимое xml в html в chrome, сохранив переменную xml как javascript, как показано ниже.
<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>
этот ответ помог мне