XSL не работает в Google Chrome - PullRequest
       2

XSL не работает в Google Chrome

19 голосов
/ 30 декабря 2010

Я видел много постов вокруг этого ... но я не могу понять, в чем моя проблема!Google Chrome просто отображает пустую страницу, когда я пытаюсь преобразовать XML с помощью XSL.Когда я просматриваю источник, я вижу необработанный 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 для Chrome, но это не помогло.Что я тут не так делаю?

Ответы [ 5 ]

15 голосов
/ 06 июня 2011

Причина, по которой это не работает, связана с проблемой безопасности, которую Chrome рассмотрел неоднозначно [1] [2] [3] [4] , блокируя доступ XML-файлов к локальным XSLT-файлам в одном и том же каталоге, в то время как HTML-файлы могут обращаться к файлам .CSS в одном и том же каталоге.1012 * Объяснение, данное командой Chrome в 2008 году, было этим :


Представьте себе такой сценарий:

  1. Вы получаете сообщение электронной почтыот злоумышленника, содержащего веб-страницу в качестве вложения, которое вы загружаете.

  2. Вы открываете локальную веб-страницу в своем браузере.

  3. На локальной веб-странице создается источник, чей источник https://mail.google.com/mail/.

  4. Поскольку вы вошли в Gmail, фрейм загружает сообщения в ваш почтовый ящик.

  5. Локальная веб-страница читает содержимое фрейма, используя JavaScript для доступа к фреймам [0] .document.documentElement.innerHTML.(Веб-страница в Интернете не сможет выполнить этот шаг, поскольку она будет происходить из источника, не принадлежащего Gmail; политика того же источника приведет к сбою чтения.)

  6. Локальная веб-страница помещает содержимое вашего почтового ящика в и передает данные через форму POST на веб-сервер злоумышленника.Теперь у атакующего есть ваш почтовый ящик, который может быть полезен для рассылки спама или выявления кражи.

Gmail ничего не может сделать, чтобы защитить себя от этой атаки.


Я согласен, что это раздражает, в качестве исправления у вас есть 2 решения:

  1. Попробуйте запустить Chrome с переключателем --allow-file-access-from-files (я сам не проверял)

  2. Загрузите его на хост, и все будет хорошо.

5 голосов
/ 23 декабря 2011

Загрузка на хост soves проблема для меня.Переключатель --allow-file-access-from-files у меня не сработал.

2 голосов
/ 30 декабря 2010

В старой версии Chrome, если вы не выводите правильный документ с известным словарем (HTML, XHTML, SVG и т. Д.), Вы не получите отрендеренную страницу.

В современной версии (у меня установлено 10.0.612.3 dev) вы получаете XML-документ без стилей (с ошибкой синтаксического анализа в вашем случае из-за более чем одного результата корневого элемента).

Решение : Вывести правильный (со всеми обязательными элементами) документ HTML 4.0 или правильный (также с правильным пространством имен) документ XHTML 1.0.

0 голосов
/ 04 августа 2017

Я смог загрузить содержимое 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 мне помог этот ответ

0 голосов
/ 24 мая 2017

Использование переключателя --allow-file-access-from-files помогает мне.

Я пытался использовать автономную документацию с установленного программного обеспечения в моей системе. IE показывал содержимое, запрашивая разрешение на включение содержимого. Я бы сказал, что это можно добавить и к Chrome, не жертвуя безопасностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...