-
Подключение entity в XSL-шаблон
Я очень люблю использовать XSL в качестве шаблонизатора — более гибкого механизма для вывода HTML/XML не придумаешь. А еще я использую Eclipse в качестве основной среды разработки: хоть он тяжелый и глючный, собака, но он единственный удовлетворяет большинство моих потребностей (никуда не перелезу, пока там не появится аналог PyDev и Mylyn).
Шаблоны, которые я использую, построены на кастомных энтити. Так как XSL-переменные нельзя использовать в атрибуте
matchшаблона, это довольно удобный способ их эмулировать:<!ENTITY navigation "/document/system/navigation[@type = 'root']"> ... <xsl:template match="&navigation;"> <ul id="nav"> ... </ul> </xsl:template>
Все энтити хранятся в отдельном файле (entities.dtd), которые я подключаю вот так:
<!DOCTYPE xsl:stylesheet SYSTEM "entities.dtd"> <xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ... </xsl:stylesheet>
В «штатном» Eclipse XSL editor это приводит к тому, что перестает code complete по XSL-тэгам — это баг всего Web Tools Project, связанный с тем, что при одновременном использовании XML Schema и внешнего файла с энтити предпочтение по code complete отдается последнему. Поиск решения этой проблемы привел меня к довольно интересному открытию. Теперь энтити я подключаю вот так:
<!DOCTYPE xsl:stylesheet [ <!ENTITY % core SYSTEM "entities.dtd"> %core; ]>
Это не только восстанавливает работу code complete, но и добавляет следующее преимущество: можно создавать локальные энтити в каждом файле и матчить на них шаблоны:
<!DOCTYPE xsl:stylesheet [ <!ENTITY % core SYSTEM "entities.dtd"> %core; <!ENTITY my_entity "/path/to/element[@with = 'very complex expression']"> ]> ... <xsl:template match="&my_entity;"> сделать что-нибудь </xsl:template> <xsl:template match="&my_entity;[@some_attr = 'true']"> сделать что-нибудь другое </xsl:template>
13 комментариев

от это полезная фича!
Круто, так можно подключать даже несколько файлов с энтити в один шаблон, чего мне всегда так не хватало. Зачет!
Клево
Хм, интересно, будем пробовать, спасибо.
А Mylyn, как я понял, это какой-то таск-менеджер (TODO-лист), можешь рассказать что в нем такого, что прям «никуда» ^_^
Mylyn — это не совсем таск-менеджер (хотя есть такая функциональность для локальных задач), а интеграция с популярными багтрэкерами (Bugzilla, Trac, Jira и так далее). Я его использую, потому что:
Там еще дофига всего, советую посмотреть скринкаст про идеологию и возможности Mylyn.
Хочу посмотреть что такое и с чем едят Eclipse. Какая из этих http://www.eclipse.org/downloads/ версий стоит у вас?
Если не стоит задачи подружить это всё с эклипсовским Web Tools Project, то для подключения локальных энтити вместе с глобальными можно использовать чуть более простую запись:
<!DOCTYPE xsl:stylesheet SYSTEM "global.dtd"[ <!ENTITY local "some very custom rule"> ]>Ну а если уж нужно подключить несколько внешних файлов — то только серёгиным способом через параметрические энтити %core;. Или использовать комбинированный вариант, который, на мой взгляд, наиболее точно отражает иерархию “Глобальные энтити - Энтити пакета - Локальные энтити”:
P.S. Серёга, по-моему, стоит обновить статью в техногрете (http://www.artlebedev.ru/tools/technogrette/soft/eclipse-introduction/) и рассказать о твоём решении там тоже. Всё-таки там (пока (-:) больше посетителей.
Посоветуйте по xsl хорошую книгу, пожалуйста.
Я как раз разбираюсь с сущностями в XSLT и не могу понять, почему в вызваемом шаблоне на месте &название-сущности; пустое место, а в шаблонах, подключаемых через xsl:include, все сущности работают как надо. Не подскажите в чем ошибка?
Провести и записать новую лекцию в студии?
Может дойдут руки и допишу нужный фрагмент.
Книг посоветовать не могу, так как практически их не читаю. Из ресурсов по XSLT для начинающих могу посоветовать только W3C Schools.
Можете прислать мне на почту пример, я посмотрю.
Сергей, расскажите как-нибудь, как именно вы используете XSLT для шаблонизации. На каком-нибудь простом примере. Потому что я давно задумываюсь над этим, но ничего хорошего не надумал. Как добиться с его помощью усложнения, я представляю, а вот как упрощения?
Основное преимущество XSLT в том, что он изначально заточен для использования вместе с XML/xHTML.
Возьмем ситуацию с данными, которые вносит пользователь. Например, нужно, чтобы у всех ссылок внутри тэга <blockquote> появлялись скругленные уголки (доп. элементы). Пишем простой шаблон:
Соответственно, на входе получаем чистый HTML без всяких оформительских данных, а на выходе — декорированные элементы. И пользователю проще вносить данные, и нам легче поддерживать и модифицировать проект.
В целом, XSLT удобен именно эффективным «перехватом» XML-элементов. С грамотно составленным шаблоном можно творить чудеса. Например, я сейчас на своем проекте могу полностью поменять структуру выходного HTML-документа в зависимости от идентификатора новости, причем для этого мне достаточно всего лишь создать отдельный XSL-файл и подключить его в основной файл. При этом мне достаточно поменять пару-тройку шаблонов (<xsl:template>), все остальное автоматически будет унаследовано.
Согласен, что XSLT — не самый простой шаблонизатор для изучения, а некоторые привычные вещи делаются там очень сложно (взять хотя бы простейший for-цикл или замену подстроки в тексте), но, тем не менее, чего-то более удобного для сайтов я пока не встречал.
>>>Посоветуйте по xsl хорошую книгу, пожалуйста
Посоветую 3, если всерьез хотите знать XSLT.
1. Майкл Кей, «XSLT. Справочник программиста». 2002. В бумаге найдете не найдете скорее всего, в сети возможно, сам не искал, есть в бумажном. На год не смотрите, там база дается актуальная и по сей день.
2. «Технология XSLT», Алексей Валиков. http://xmlhack.ru/books/xslt/
3. Мангано С. «XSLT. Сборник рецептов» http://www.books.ru/shop/books/582070 Но книга не для новичков.
Начните с Валикова.