Чтобы избежать дублирования, необходимо выделить логику по выборке как общую, так и специфичную для конкретного документа. Так же локализация должна быть общей для всех представлений.

Получается следующая иерархия шаблонов:
- View.xsl - общая логика по выборке;
- Web.xsl - формирование HTML вида;
- Wiki.xsl - формирование Wiki вида;
- LocEn.xsl - специфичная логика построения (дополняет общую), причём определяет только структуру, а никак не вид; И английская локализация;
- LocRu.xsl - переопределение локализации на русскую;
- LocViewEn.xsl, LocViewRu.xsl, LocWikiEn.xsl и LocWikiRu.xsl - остальные шаблоны содержат лишь объединение вышеперечисленных.
Изначально я планировал шаблоны вида включать с помощью <xsl:include>, но потом мне потребовалось переопределить ихние правила, а <xsl:import> всегда имеет приоритет ниже. Ещё шаблон объединения для русского HTML вида вообще не потребовался, т.к. я сделал переключение языков на JavaScript-е. В остальном диаграмма актуальна.
Помимо изменения иерархии, в текущую версию вошло следующее:
- Смена локализации: для HTML представления добавилась возможность выбора языка отображения. Но реализовать выбор с помощью XSLT не получится, т.к. тут потребуется действие пользователя уже после преобразования. Поэтому я использовал XSLT преобразование с помощью JavaScript. Для загрузки исходного XML и XSL шаблона используется ActiveXObject("MSXML2.DOMDocument") для Internet Explorer и XMLHttpRequest вместе с XSLTProcessor для Firefox. Результат преобразования затрагивает только один HTML элемент DIV, поэтому преобразование для выбранного языка запускается с корневого элемента, а не с корня документа. Ещё из особенностей - выбор шаблона. Для этих целей, в исходном XML находится шаблон по умолчанию (через <?xml-stylesheet?>) и изменяется импорт шаблона, в данном случае LocEn.xsl на локализированную версию.
- Локализация по умолчанию: используется всё тот же JavaScript на событии загрузки тела документа (можно было бы и на преобразовании сделать), но проблема оказалась в Firefox, т.к. navigator.language похоже возвращает язык интерфейса браузера. После определения языка шаблон для локализации ищется среди построенных ссылок с языками.
- Идентификация: механизм пришлось менять из-за ограниченности Wiki ссылок. Поэтому политика идентификации объектов основана на английском названии. Для HTML вида убираются ряд символов, а для Wiki вида - только пробелы заменяются на "_". Но если английского названия нет, приходится использовать атрибут @Name. К сожалению не всегда это проходит, поэтому проблема пока открытая.
- Раздельное форматирование: в шаблоне View.xsl форматирование теперь разбито на текст и всплывающую подсказку. С помощью этого разделения теперь явно указывается вид форматирования, что позволяет избежать лишних тегов. В частности, для Wiki вида, всплывающие подсказки у ссылок просто не выводятся, т.к. тег <span> в ссылках использовать нельзя.
Комментариев нет:
Отправить комментарий