Подтвердить что ты не робот

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, но это не помогает. Что я здесь делаю неправильно?

4b9b3361

Ответ 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>

screenshot этот ответ помог мне