Невозможно получить xsl стили для файла
Стандарт Extensible Stylesheet Language Transformation (XSLT) указывает определение языка для преобразований данных XML. XSLT используется для преобразования XML-документов в XHTML-документы или в другие XML-документы. В этой статье показано, как использовать XSLT с Microsoft Office Project XML-файлами обмена данными 2007 г. для фильтрации и отображения сведений о проекте. (Содержимое этой статьи было предоставлено Джессикой Бриттон, корпорация Майкрософт.)
Сведения о сохранении проектов в виде Project XML-файлов обмена данными см. в материалах Saving and Opening Projects in XML Format.
Таблица стилей XSLT — это XML-документ, состоящий из сочетания разметки XHTML, правил шаблона XSLT и отчетов XPath, которые работают вместе.
Разметка XHTML определяет среду отображения, в которой представлены XML-данные.
Правила шаблона XSLT предоставляют инструкции по преобразованию элемента XML источника определенным образом.
В заявлениях XPath определяются определенные элементы в документе XML.
Если элемент XML соответствует шаблону XPath, вызывается связанное правило шаблона XSLT. Преобразованные данные затем отображаются в рамках отображения, заданной разметка XHTML.
Дополнительные сведения о правилах шаблона XSLT и утверждениях XPath см. в ссылке в конце этой статьи.
2 ответа
Предупреждение: это решение может снизить безопасность вашего браузера Firefox! Как упоминалось в ответе @evilpie, вы также можете получить доступ к файлам через локальный браузер, что делает ненужным изменение приведенного ниже ответа.
Кажется, это обычная проблема, заключающаяся в том, что более новые версии Firefox применяют более строгую политику в отношении источника комбинации XML-XSLT. Если XML и XSLT являются локальными файлами, Firefox заблокирует / проигнорирует ссылку на XSLT.
Решение заключается в изменении одного параметра в about:config : Установить
Это должно сделать ваш XML-файл желаемым. Причины объясняются здесь, в Mozilla, в следующих «Возможных значениях и их последствиях»:
Верно:
Локальные документы имеют доступ к другим локальным документам в том же каталоге и в подкаталогах, но не к спискам каталогов. (По умолчанию)
Неверно: Локальные документы имеют доступ ко всем остальным локальным документам, включая списки каталогов.
Почему необходимо установить это значение на false , хотя XSLT находится в том же каталоге, что и XML, и не требует перечисления каталогов - я не знаю. Может быть, это какая-то причуда древней реализации Firefox XSLT.
Примерно так как Firefox 68 обрабатывает локальные файлы как всегда с перекрестным происхождением. (См. «локальный HTML-файл может привести к краже файла»). Это предотвращает различные проблемы безопасности и конфиденциальности, такие как атака, захватывающая локальные данные в той же папке, что и загруженный файл HTML. См. Также статью «Ограничения для URL-адресов файлов».
В отличие от того, что рекомендует zx485, вы можете установить privacy.file_unique_origin на false в about: config.
Изменение security.fileuri.strict_origin_policy более небезопасно и не должно выполняться, поскольку оно позволяет получить доступ ко всем файлам на вашем компьютере.
Процедура 2. Чтобы изменить Project XML-файл, используйте таблицу стилей XSLT:
Откройте файл Project XML в Visual Studio или в другом тексте или редакторе XML.
Вставьте следующую строку кода после объявления XML, которая является первой строкой в Project XML-файле.
Удалите объявление пространства имен XML из Project, который является корневым элементом Project XML-файла. Если вы не удалите объявление пространства имен, встроенное в элемент Project, XPath не будет соответствовать элементам в XML Project XML-файле.
После выполнения этапов 2 и 3 первые три строки XML Project XML-файла должны выглядеть следующим примером кода.
Сохраните Project XML-файл.
Рекомендуется сохранить файл с помощью имени файла, которое отличается от исходного имени XML Project XML, так как изменения, внесенные в шаге 3, отсоедят XML-файл Project от схемы Project XML-обмена данными.
Просмотр преобразованного Project XML-файла. Преобразование XSLT можно выполнить в Visual Studio, задав свойство Stylesheet XML Project xML-файла ProjectTransform.xslt, а затем выбрав show XSLT Output из меню XML.
Вы также можете открыть Project XML-файл в Internet Explorer 7, Microsoft Office Word 2007 или любом другом приложении, которое поддерживает XSLT.
На рисунке 1 показан преобразованный выход Project XML-файла в Word 2007. Когда вы открываете Project XML-файл, по умолчанию отображается только представление данных. Чтобы просмотреть преобразованный выход, необходимо выбрать представление данных ProjectTransform.xslt в области документов XML.
В прошлой статье я описал как реализовать инклудинг и кеширование при обработке xsl-темплейтов на стороне клиента. Сегодня я раскажу с помощью каких инструментов можно проводить отладку xslt-преобразований на стороне клиента и о работе конструкции в firefox.
Отладка XSLT на клиенте
Во время обработки xsl-документов в браузере могут происходить различные ошибки:
1) сетевые ошибки — когда xml или xsl данные не были получены;
2) ошибки обработки шаблонов.
Сетевые ошибки
Для контроля сетевых ошибок можно использовать отладочные средства браузеров. Все отладочные средства firebug (firefox), dragonfly (opera) и devtools (chrome) могут показать какие ресурсы были загружены из сети непосредственно ассинхронным запросом. Например, если мы обрабатываем данные in_data.xml с помощью шаблона first.xsl, то загрузку этих данных мы сможем проконтролировать
— раздел «net» в firebug
— раздел «net» в dragonfly
— раздел «resources» в devtools.
Иначе дело обстоит если для успешной обработки нужно подгрузить дополнительный xsl-файл (инклуд). В этом случае firebug (firefox) не покажет, что что-то было загружено.
А интегрированные среды дебагинга dragonfly (opera) и devtools (chrome) покажут какие дополнительные xsl файлы были подгружены.
Ошибки обработки шаблонов
* This source code was highlighted with Source Code Highlighter .
В этом случае вывод ошибки будет примерно таким:
Событие «error» будет вызвано в случае возникновения ошибки. В функцию события будет передано несколько параметров, основной из которых — error — собстенно описание ошибки.
disable-output-escaping=«yes» в firefox
Описание проблемы
В некоторых случаях в xml-данных могут приходить целые куски отформатированного html, в этих случаях эти куски нужно вставлять в конечный документ без изменений, то есть «как есть». Например это могут быть данные, содержащие результаты поиска, в которых искомое слово выделенно жирным («мы искали все возможные решения»). Сделать простую замену текста средствами xslt можно, но того не стоит (попробуйте как-нибудь на досуге заняться этим). Поэтому проще передавать уже отформатированный текст. Опытный программист придумает ещё массу примеров. Для вставки данных без экранирования в xslt есть специальный атрибут disable-output-escaping, который необходимо установить в «yes». Выглядит это так
* This source code was highlighted with Source Code Highlighter .
Решение проблемы
Существует такое решение проблемы — использовать вместо конструкции вызов . Но в этом случае мы не можем передать в узле xxx данные в виде
* This source code was highlighted with Source Code Highlighter .
* This source code was highlighted with Source Code Highlighter .
то есть это будет уже не совсем верный xml-файл. И тогда мы получаем проблему в остальных браузерах, где такое решение работать уже не будет.
Другое решение проблемы
Я решил использовать другой подход. Использовать специальный фикс, написанный на javascript.
1. Вместо привычного в наших шаблонах придётся использовать вызов
* This source code was highlighted with Source Code Highlighter .
Где темплейт inc_disable_output_escaping выглядит так:
* This source code was highlighted with Source Code Highlighter .
В этом темплейте по имени xsl-процессора (xsl:vendor) мы выведем данные стандартной конструкцией с disable-output-escaping=«yes», а в случае xsl-процессора от firefox'а данные вставим в невидимый контейнер так, как firefox эти данные может вставить, то есть в экранированном виде.
А потом, после успешного преобразования, и обновления DOM документа, мы перекодируем данные в этих контейнерах на правильные и вставим их на место этих контейнеров.
function fix_ff_disable_output_escaping() jQuery( 'div.fix_ff_disable_output_escaping' ).each(
function (i, obj) var j_obj=jQuery(obj);
j_obj.replaceWith(Encoder.htmlDecode(j_obj.html()));
>
)
>
* This source code was highlighted with Source Code Highlighter .
Для декодирования html-мнемоник используется функция htmlDecode js-библиотеки Encoder.
PS Не забывайте отправлять правильный content-type для xml/xsl документов. А именно «Content-type: text/xml».
Вы уже используете XSLT в качестве шаблонизатора на сервере. Настал черёд перенести xsl-трансформацию на клиента. Можно, например, воспользоваться способом описанным в статье На клиенте! Получить XML! Получить XSL! Сделать XHTML! Марш!. Но это было бы слишком просто, потому что каждый браузер добавляет несколько своих нюансов при работе с XSLT.
Вопросы о способе загрузки xsl- и xml-файлов и их обработки в различных браузерах был рассмотрен в указанной выше статье. Рассмотрим другие вопросы:
1) инклудинг;
2) кеширование;
Инклудинг
Простая инструкция вида
,
которая превосходно работает в случае xsl-трансформации на сервере, при разборе в некоторых браузерах не будет корректно обработана. Все браузеры смогут подгрузить дополнительный xsl-файл если к нему указан полный URL. Например такой:
.
Можно в xsl-файлах, которые будут подгружаться браузером, прописывать полные пути. Но тогда теряется элегантность решения. Да и не всегда мы знаем наверняка на каком домене будет крутиться сайт. Поэтому прежде чем делать трансформацию на клиенте, необходимо с помощью javascript заменить относительные пути на абсолютные.
В примере "Тест инклудинг" обрабатывается одинарный инклуд. Здесь основной xsl-файл 1.xsl подгружает дополнительный файл-разметки 1_1.xsl.
В примере "Тест двойной инклудинг" обрабатывается двойной инклуд. Здесь основной xsl-файл 2.xsl подгружает 2_1.xsl, который в свою очередь обращается к ещё одному xsl-файлу 1_1.xsl.
Кеширование
Firefox, Chrome и Opera по умолчанию кешируют загруженные файлы, так же как обычные медиа-файлы. Так, что если обновить страницу сайта, то кеш потеряет актуальность и файлы будут загружены с сети заново.
Иначе поступает IE. Он кеширует эти данные раз и навсегда (на продолжительное время), так что даже после обновления страницы браузер будет в твёрдой уверенности, что ранее загруженные файлы не потеряли своей актуальности. Единственный вариант обновить данные — очистить кеш браузера вручную.
В примере "Тест инклудинг" можно «поиграть» настройками кеширования. Результаты работы настроек можно пронаблюдать с помощью средств отладки: Firebug, Dragonfly, Developer Tools.
Использованные инструменты
Не рассмотренные вопросы
Остались ещё 2 не рассмотренных вопроса:
1) отладка при ошибках загрузки и трансформации;
2) проблема обработки инструкции disable-output-escaping=«yes» в firefox.
О них в другой раз.
Отображение Project с помощью преобразований XSLT
Настройка открытия файлов выписок XML от "Росреестра" с таблицами стилей XSL
При открытии файлов с локального диска таблицы стилей с удаленного сервера не применяются. В результате вместо красивой таблицы в браузере выводится ошибка. Например, такая ситуация имеет место с XML выписками из "Росреестра".
Ограничение CORS (Cross-origin resource sharing) запрещает странице загружать ресурсы за пределами данного сайта. При включенном CORS страница с локального диска не может обращаться к ресурсам в Интернет (эти попытки пресекаются браузером). В случае открытия XML файла - не подгружаются таблицы стилей с сервера "Росреестра" и возникает ошибка:
"Ошибка загрузки таблицы стилей: Произошла неизвестная ошибка (805303f4)
https://portal.rosreestr.ru/xsl/EGRP/Reestr_Extract_Gkn/OKS/07/Common.xsl"
Решение проблемы с отображением стилей XSL довольно простое: нужно использовать Mozilla Firefox с включенным расширением "CORS Everywhere".
Пошаговая инструкция:
- Установите расширение в Mozilla Firefox расширение "CORS Everywere" - https://addons.mozilla.org/ru/firefox/addon/cors-everywhere/
- Войдите в about:config и найдите параметр security.fileurl.strict_origin_policy и смените его значение с true на false.
- В about:addons в настройках плагина CORS установите автоматический запуск расширения при запуске браузера:
- Сделайте Mozilla FireFox программой для открытия XML файлов по умолчанию (Щелкните в Проводнике по файлу XML и выберите пункт "Открыть с помощью", нажмите на "Показать все приложения" и выберите Mozilla Firefox. Поставьте галочку "Открывать все файлы данного типа").
- Перезапустите браузер FireFox.
- На панели плагинов включите расширение - нажмите на значок розового квадрата и значок сменит свой цвет на зеленый.
Я понятия не имею, почему мой код не взаимодействует со мной и моим xml. Прошу прощения за то, что даю картинки, но когда я даю код, сайт отображает конечный результат, а не сам код, и я не знаю, как его изменить.
Мой код XSLT Я действительно не знаю, что не так, кажется, что они неправильно связаны друг с другом, но я все еще невежественен.
Процедура 1. Чтобы создать таблицу стилей XSLT:
Создайте XSLT-файл для таблицы стилей. Если вы работаете в Microsoft Visual Studio 2005 г., вы можете использовать шаблон XSLT File (в Visual Studio нажмите кнопку Файл, указать на Новый , а затем нажмите файл . Этот шаблон предварительно заселяется кодом XML, показанным в следующем примере. Если вы работаете в другом тексте или редакторе XML, скопируйте XML-шаблон и вклейте его в XSLT-файл.
Удалите следующий комментарий по коду XML. Здесь вы пишете XSLT-код.
Создайте код XSLT. Код XSLT, показанный в этом примере, делает следующее:
Отображает текстовое значение имени ребенка элемента Project в загонах.
Проверяет ребенка сводки каждого элемента Задачи, чтобы узнать, является ли значение 0 (false).
Тестирует критическое дитя каждого элемента Задачи, чтобы узнать, является ли значение 1 (true).
Отображает данные для критически важных задач, которые не являются сводными задачами в жирный шрифт.
Отображает данные для некритических задач, которые не являются сводными задачами.
Сортировка сведений о ресурсах в алфавитном порядке по текстовому значению имени каждого элемента Ресурса.
Тестирует переоправдаемого ребенка каждого элемента Ресурса, чтобы узнать, является ли значение 1 (true).
Отображает отсортченные данные ресурсов только для перенаваляемых ресурсов.
Сохраните файл в качестве ProjectTransform.xslt.
После создания таблицы стилей XSLT необходимо связать Project XML-файл с ней, добавив инструкции по обработке. В процедуре 2 показано, как связать файл ProjectTransform.xslt, созданный в процедуре 1, с любым Project XML-файлом.
Читайте также: