Як я можу змусити XSLT працювати в хромі?


87

У мене є документ XML тут , що подається з відповідним файлом XSL . Перетворення залишається виконаним на стороні клієнта, без JavaScript.

Це чудово працює в IE (шоковий жах), але в Google Chrome просто відображаються текстові вузли документа.

Я знаю, що в Chrome можна зробити XSL на стороні клієнта, оскільки я бачив приклади цього, але я ще не зможу повторити цей успіх сам

Що я роблю не так?


Було б чудово опублікувати рішення, коли ви це знаєте. Я насправді не використовував Chrome для чогось серйозного - це здається мені іграшкою Google. Навіщо потрібно виконувати XSLT на стороні клієнта?
Dimitre Novatchev

Я не. Я просто думав, що це буде якось акуратно. І я все одно хотів би знати, чому деякі речі працюють у Chrome, але моє - ні. Ох, і для користувачів IE, вибачте за звірський веселковий стиль сторінки.
Ерік

12
Для мене Chrome може перетворити лише при відкритті XML через http: //, він не працює при роботі через file: //, атрибут xmlns для мене не має ніякого значення.
Ярослав Заруба

Ця помилка згадується тут
Flavio Cysne

1
Фактична помилка chrome для цього знаходиться на code.google.com/p/chromium/issues/detail?id=111905
Грант Пітерс

Відповіді:


116

Інша відповідь нижче Еріка є помилковою. Декларація простору імен, яку він згадав, не мала нічого спільного з проблемою.

Справжня причина, через яку це не працює, пов’язана з проблемами безпеки (див. Випуск 4197 , випуск 111905 ).

Уявіть собі такий сценарій:

  1. Ви отримуєте електронне повідомлення від зловмисника, що містить веб-сторінку як вкладення, яке ви завантажуєте.

  2. Ви відкриваєте локальну веб-сторінку у своєму браузері.

  3. Локальна веб-сторінка створює <iframe>джерело, джерелом якого є https://mail.google.com/mail/ .

  4. Оскільки ви ввійшли в Gmail, фрейм завантажує повідомлення у вашу поштову скриньку.

  5. Локальна веб-сторінка зчитує вміст кадру за допомогою JavaScript для доступу frames[0].document.documentElement.innerHTML . (Веб-сторінка в Інтернеті не зможе виконати цей крок, оскільки вона походить від джерела, не пов’язаного з Gmail; політика того самого джерела спричинить збій читання)

  6. Локальна веб-сторінка розміщує вміст вашої папки "Вхідні" в <textarea>і передає дані через форму POST на веб-сервер зловмисника. Тепер у зловмисника є ваша папка "Вхідні" , що може бути корисно для розсилки спаму або виявлення крадіжок.

Chrome порушує вищезазначений сценарій, обмежуючи локальні файли, відкриті за допомогою Chrome. Для подолання цих обмежень ми маємо два рішення:

  1. Спробуйте запустити Chrome із --allow-file-access-from-files позначкою. Я не тестував цього сам, але якщо це спрацює, ваша система тепер також буде вразливою до сценаріїв, згаданих вище.

  2. Завантажте його на хост, і проблема вирішена.


2
Це правда, однак це не була єдиною причиною проблеми. Я вже деякий час стежу за звітом про помилки . Однак я також не міг змусити його працювати на стороні сервера без xmlnsатрибута. Це могло змінитися в нових версіях chrome.
Ерік

4
@Eric ok, це може не відповісти на вашу проблему, але це правильна відповідь на ваше запитання. Судячи з коментарів відвідувачів цієї сторінки, ми можемо бачити, що відповідь, яка була позначена як відповідь, не вирішує їхніх проблем. (інакше чому б їм було б перебирати інші 6 відповідей, щоб знайти рішення)
Пейс'єр

4
@Pacerier: Це не правильна відповідь на моє запитання. Моє запитання полягало в тому, чому пара документів, розміщених на моєму сервері, перетворюється неправильно. Проблема безпеки, хоча її варто знати, не має відношення до цього конкретного питання.
Ерік

1
@Pacerier Дякую, --allow-file-access-from-filesчудово працює.
Ібн Саїд

як встановити це в macOS?
Пардіп Джейн

14

На момент написання статті виникла помилка в chrome, яка вимагала xmlnsатрибута для запуску візуалізації:

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" ... >

Це була проблема, з якою я стикався під час обслуговування файлу xml із сервера .


Якщо на відміну від мене, ви переглядаєте файл xml з file:///URL-адреси , то згадувані рішення --allow-file-access-from-filesє тими, які ви хочете


2
Гарна знахідка! Виправлено помилку для цього.
Мохамед Мансур

1
@Peter: це залежить від вашого вхідного документа. Тут специфікація XSLT досить чітка, а IE занадто прощає. Якщо введення є дійсним XHTML, воно має декларацію простору імен. Щоб XSLT знаходив щось у цьому вхідному документі, потрібно визначити простір імен. Однак не обов’язково використовувати простір імен за замовчуванням (але найпростіший).
Абель

10
@Eric: погляньте на мою відповідь, не ображайтесь, але ваша відповідь неправильна.
Pacerier

4
Це не відповідь (ані рішення, і "...", безумовно, трохи розпливчасте), відповідь Пейчер'є - правильна.
RedGlyph

Це неправильно. не потрібно, що уповільнення. Він запитує номери версій.
UDID

6

У мене була та ж проблема на localhost. Бігаючи по Інтернету в пошуках відповіді, я схвалюю, що додавання --allow-file-access-from-filesпрацює. Я працюю на Mac, тому для мене мені довелося пройти термінал sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-filesі ввести ваш пароль (якщо у вас він є).

Ще одна дрібниця - нічого не буде працювати, якщо ви не додасте до свого .xml-файлу посилання на ваш .xsl-файл наступним чином <?xml-stylesheet type="text/xsl" href="<path to file>"?>. Ще одна невеличка річ, яку я не зрозумів відразу - ви повинні відкривати свій файл .xml у браузері, а не файл .xsl.


6

Проблема, заснована на Chrome, полягає не в просторі імен xml, який є xmlns="http://www.w3.org/1999/xhtml". Без атрибута namesspace він також не буде працювати з IE.

Через обмеження безпеки ви повинні додати --allow-file-access-from-filesпрапор під час запуску хрому. Я думаю , що Linux / * Нікс користувачі можуть легко це зробити з допомогою терміналу , але і для користувачів вікон, ви повинні відкрити властивості цього ярлика Chrome і додати його в цільовому призначенні як нижче;

Клацніть правою кнопкою миші -> Властивості -> Ціль

введіть тут опис зображення

Ось зразок повного шляху із прапорами, які я використовую на своїй машині;

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files

Я сподіваюся, що показ цього кроку допоможе користувачам Windows у вирішенні проблеми, ось чому я додав цю публікацію.


4

Ну, це не працює, якщо файл XML (починаючи зі стандартного PI:

<?xml-stylesheet type="text/xsl" href="..."?>

для посилання на таблицю стилів XSL) подається як "application / xml". У цьому випадку Chrome все одно завантажить посилання на таблицю стилів XSL, але нічого не відображатиметься, оскільки він буде тихо змінювати типи документів з "application / xml" на "Document" (! ??) і "text / xsl" на " Таблиця стилів "(! ??), а потім спробує відобразити документ XML так, ніби це документ HTML (5), не запускаючи спочатку його процесор XSLT. І на екрані нічого не відображатиметься (вміст якого і надалі відображатиме попередню сторінку, на яку посилалася сторінка XML, і продовжуватиме крутити піктограму, ніби документ ніколи не був повністю завантажений.

Ви можете чудово використовувати консоль Chrome, яка показує, що всі ресурси завантажені, але вони неправильно інтерпретовані.

Тож так, Chrome наразі відображає лише XML-файли (з необов’язковою провідною декларацією таблиці стилів XSL), лише якщо він подається як "text / xml", але не як "application / xml", як слід для XML-файлу, що відображається на стороні клієнта з Декларація XSL.

Для файлів XML, що подаються як "text / xml" або "application / xml" і не містять декларації таблиці стилів XSL, Chrome все одно повинен використовувати таблицю стилів за замовчуванням, щоб відображати її як дерево DOM або принаймні як джерело тексту. Але цього не відбувається, і тут він знову намагається відтворити його так, ніби це був HTML, і негайно виправляє помилки у багатьох сценаріях (включаючи внутрішній), які намагаються отримати доступ до "document.body" для обробки подій onLoad та ін'єкції деяких javascript обробник у ньому.

Приклад сайту, який не працює належним чином (документація Common Lisp) у Chrome, але працює в IE, який підтримує клієнтський XSLT:

http://common-lisp.net/project/bknr/static/lmman/toc.html

Ця індексна сторінка вище відображається правильно, але всі посилання ведуть до XML-документів з базовою декларацією XSL до існуючого документа таблиці стилів XSL, і ви можете чекати нескінченно довго, думаючи, що розділи мають проблеми із завантаженням. Все, що ви можете зробити для читання документації - це відкрити консоль і прочитати вихідний код на вкладці Ресурси.


3

Наскільки я можу зрозуміти, Chrome шукає заголовок

Тип вмісту: text / xml

Тоді це працює - інші ітерації не вдалися.

Переконайтеся, що ваш веб-сервер надає це. Це також пояснює, чому це не вдається для файлів file: // URI xml.


2

Перевірте http://www.aranedabienesraices.com.ar

Цей сайт створений на базі клієнта XML / XSLT. Він працює на IE6-7-8, FF, O, Safari та Chrome. Чи правильно ви надсилаєте заголовки HTTP? Ви поважаєте політику того самого походження?


Дивіться мою відповідь , я її вирішив. Здається, для Chrome потрібен xmlnsатрибут.
Ерік

4
Я не думаю. Для здійснення перетворення Chrome не потрібно встановлювати простір імен за замовчуванням на XHTML. Для візуалізації XHTML, звичайно, потрібен належний XHTML. Ви змішуєте речі.

Сайт, на який посилається вище, створений не з XML, а з XHTML. Ці два не зовсім однакові (обидва - XML, але один - також HTML, а інший - ні).
jerseyboy

1

Я спробував помістити файл у wwwroot . Отже, під час доступу до сторінки в Chrome це адреса localhost / yourpage.xml .


1

Те, що каже Ерік, є правильним.

У xsl тег таблиці стилів xsl: має такі атрибути

версія = "1.0" xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" xmlns = "http://www.w3.org/1999/xhtml"

Він чудово працює в хромі.


1

Я почав тестувати це і зіткнувся з проблемою безпеки локального файлу / Chrome. Дуже просте обхідне рішення - помістити файл XML і XSL у, скажімо, загальну папку Dropbox і отримати посилання на обидва файли. Помістіть посилання на XSL-перетворення в заголовку XML. Використовуйте посилання XML у Chrome І РОБОТАЄ!


1

Через 8 років ситуація дещо змінилася.

Я не можу відкрити новий сеанс Google Chrome без інших параметрів і дозволити схему "файл:".

На macOS я роблю:

open -n -a "Google Chrome" --args \
    --disable-web-security \               # This disable all CORS and other security checks
    --user-data-dir=$HOME/fakeChromeDir    # This let you to force open a new Google Chrome session

Без цих аргументів я не можу перевірити таблицю стилів XSL локально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.