Я очень люблю использовать 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>
