Вирішення проблем обробки XSLT на стороні клієнта
Ви вже використовуєте 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. Він кешує ці дані раз і назавжди (натривалий час), тому навіть після оновлення сторінки браузер буде в твердій впевненості, що раніше завантажені файли не втратили своєї актуальності. Єдиний варіант оновити дані – очистити кеш браузера вручну.
Тому якщо нам необхідно, щоб на сайті відображалися актуальні дані, які приходять до нас у вигляді xml, необхідно дописувати постфікс. Наприклад так ra-project.net/xsl_tests/res/1.xml?_1234567890666 . А саме кешування продати на JavaScript. Те саме стосується і файлів-трансформації. Наприклад, на етапі розробки ми хочемо, щоб наш браузер завжди оперував «свіжою» версією xsl-файлу, а на продакшині можна навіть дозволити браузеру закешувати цей xsl-файл.
У прикладі "Тест інклудинг" можна "пограти" налаштуваннями кешування. Результати роботи налаштувань можна спостерігати за допомогою налагодження: Firebug, Dragonfly, Developer Tools.
Використані інструменти
Для xsl-трансформації на стороні клієнта я використав плагін до jQuery Transform, в якому були додані функції кешування та доопрацьований механізм інклудингу. Доопрацьований варіант можна взяти ra-project.net/xsl_tests/jquery.transform.js.
Не розглянуті питання
Залишилися ще 2 не розглянуті питання: 1) налагодження при помилках завантаження та трансформації; 2) проблема обробки інструкції disable-output-escaping=«yes» у firefox. Про них в інший раз.
UPD.Реальний працюючий приклад використання даної техніки. juick.ra-project.net/stats#ra Тут виводиться статистика постів по місяцях. При натисканні на певний місяць підвантажуються xml-дані місяця та xsl-файл. При цьому xsl-файл буде завантажено лише один раз. А XML-дані кешуються, тому якщо «гуляти» за списком місяців, то одного разу завантажені дані незнову братимуться з сервера, а візьмуться з кеша.
Хардкорна конфа за С++. Ми запрошуємо лише профі.