У меня есть XML, который я бы хотел преобразовать в HTML, используя несколько XSL файлов. Эти XSL файлы связаны между собой через команды xsl: import и xsl: include и все необходимые для завершения преобразования.
Я знаю, что XSL работает, потому что использование директивы <?xml-stylesheet type="text/xsl" href="transform.xsl"?>
в предварительно созданном XML файле, открываемом браузером, отображает результат, который я хочу. Проблема в том, что я хочу иметь возможность реплицировать эту функциональность на динамически генерируемый XML.
Есть два способа увидеть, что это можно сделать, но у обоих, похоже, есть ограничения, с которыми я не мог работать.
Первое решение - использовать Javascript для преобразования XML. Из того, что я могу сказать, для этого потребуется объект XSLTProcessor для загрузки нескольких XSL файлов, но Chrome (и, возможно, другие браузеры) не поддерживают xsl: import очень хорошо - http://code.google.com/p/chromium/issues/detail?id=8441
Я также посмотрел на запись XML в iFrame или в новое окно, но директивы <?xml-stylesheet type="text/xsl" href="transform.xsl"?>
закомментированы в появившемся окне. На самом деле все, что написано в новом окне, равно HTML - я не нашел способ записать XML в новое окно.
Итак, как я могу получить окно браузера для отображения результата XML файла, преобразованного с помощью набора XSL файлов?
UPDATE
Итак, вот результаты моего исследования этой проблемы.
Возможное обходное решение: скомпилируйте инструмент, например xsltproc, в JavaScript с помощью emscripten. Я действительно это сделал - см. https://github.com/mcasperson/xsltproc.js
Проблема: это невероятно медленно в firefox (что занимает 5 секунд в Chrome, занимает 30+ в firefox), и вы не можете запускать код в веб-клиенте Chrome - https://code.google.com/p/chromium/issues/detail?id=252492
Возможное обходное решение: вообще не используйте XSL, но отобразите XML с помощью таблиц стилей CSS.
Проблема: пока браузеры не начнут внедрять функцию css attr(atrributename, url)
, невозможно трактовать ссылку на файл в атрибуте XML как нечто, отличное от строки, что делает невозможным отображение изображений.
Возможное обходное решение: объединить все XSL файлы в одну таблицу стилей
Проблема. Это несколько возможно (см. Объединить несколько таблиц стилей xslt), но xsl: import и xsl: include имеют определенную семантику, которая не переносятся, просто заменяя содержимое файлов вместо оператора xsl: import или xsl: include. Для больших преобразований XSL, разбитых на несколько файлов, это решение потребует много ручной работы.
Возможное обходное решение. Запишите содержимое XML в iframe или в новое окно.
Проблема. Невозможно записать XML в новое окно или iframe. Содержимое, записанное в эти элементы, всегда считается HTML и вставляется в элемент HTML- > BODY.
Возможное обходное решение. Создайте службу на стороне сервера, которая принимает XML, а затем возвращает этот XML с помощью директивы таблицы стилей XSL. Затем URL-адрес службы можно использовать как атрибут src
для iframe или нового окна.
Проблема. Служба должна быть конечной точкой GET, а это означает, что возвращаемый XML должен быть включен как параметр запроса, что означает, что вы в конечном итоге столкнетесь с проблемами с длина URL-адреса.
Возможное обходное решение. Используйте библиотеку javascript XSL, например Saxonica CE.
Проблема. Это может работать (я не пробовал), но Saxonica CE не является открытым исходным кодом (что является требованием нашего проекта).