• Подключение 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 комментариев

    1. 28 мая 2009

      от это полезная фича!

    2. 28 мая 2009

      Круто, так можно подключать даже несколько файлов с энтити в один шаблон, чего мне всегда так не хватало. Зачет!

    3. scorpix
      28 мая 2009

      Клево :)

    4. Vii
      28 мая 2009

      Хм, интересно, будем пробовать, спасибо.

      А Mylyn, как я понял, это какой-то таск-менеджер (TODO-лист), можешь рассказать что в нем такого, что прям «никуда» ^_^

    5. Сергей Чикуенок
      28 мая 2009

      Mylyn — это не совсем таск-менеджер (хотя есть такая функциональность для локальных задач), а интеграция с популярными багтрэкерами (Bugzilla, Trac, Jira и так далее). Я его использую, потому что:

      1. Всегда перед глазами актуальный список задач (а все оповещения по почте у меня автоматически отправляются в трэш).
      2. Ставить и комментировать задачи можно прямо в Eclipse. В том числе есть удобный инструмент для создания скриншотов.
      3. Автоматически считает время, потраченное на задачу. Если нет никакой активности (отошел, например, на обед) — ставит таймер на паузу.
      4. Сохраняет контекст (редактируемые файлы) текущей задачи. Суперудобно при переключении с задачи на задачу: автоматически открываются/закрываются нужные файлы.
      5. Интеграция с другими плагинами Eclipse. Например, когда делаю коммит в SVN автоматически ставит в комментарий название и ссылку на задачу.

      Там еще дофига всего, советую посмотреть скринкаст про идеологию и возможности Mylyn.

    6. Сергей
      30 мая 2009

      Хочу посмотреть что такое и с чем едят Eclipse. Какая из этих http://www.eclipse.org/downloads/ версий стоит у вас?

    7. Александр Самиляк
      30 мая 2009

      Если не стоит задачи подружить это всё с эклипсовским Web Tools Project, то для подключения локальных энтити вместе с глобальными можно использовать чуть более простую запись:

      <!DOCTYPE xsl:stylesheet SYSTEM "global.dtd"[
          <!ENTITY local  "some very custom rule">
      ]>
      

      Ну а если уж нужно подключить несколько внешних файлов — то только серёгиным способом через параметрические энтити %core;. Или использовать комбинированный вариант, который, на мой взгляд, наиболее точно отражает иерархию «Глобальные энтити — Энтити пакета — Локальные энтити»:

      <!DOCTYPE xsl:stylesheet SYSTEM "global.dtd"[
      	<!ENTITY % package SYSTEM "package.dtd"> %package;
      
      	<!ENTITY local  "some very custrom rule">
      ]>
      

      P.S. Серёга, по-моему, стоит обновить статью в техногрете (http://www.artlebedev.ru/tools/technogrette/soft/eclipse-introduction/) и рассказать о твоём решении там тоже. Всё-таки там (пока (-:) больше посетителей.

    8. Василий Колбасилий
      31 мая 2009

      Посоветуйте по xsl хорошую книгу, пожалуйста.

    9. Александр
      31 мая 2009

      Я как раз разбираюсь с сущностями в XSLT и не могу понять, почему в вызваемом шаблоне на месте &название-сущности; пустое место, а в шаблонах, подключаемых через xsl:include, все сущности работают как надо. Не подскажите в чем ошибка?

    10. Сергей Чикуенок
      1 июня 2009

      Серёга, по-моему, стоит обновить статью в техногрете

      Провести и записать новую лекцию в студии? :) Может дойдут руки и допишу нужный фрагмент.

      Посоветуйте по xsl хорошую книгу, пожалуйста.

      Книг посоветовать не могу, так как практически их не читаю. Из ресурсов по XSLT для начинающих могу посоветовать только W3C Schools.

      Я как раз разбираюсь с сущностями в XSLT и не могу понять, почему в вызваемом шаблоне на месте &название-сущности; пустое место, а в шаблонах, подключаемых через xsl:include, все сущности работают как надо. Не подскажите в чем ошибка?

      Можете прислать мне на почту пример, я посмотрю.

    11. 1 июня 2009

      Сергей, расскажите как-нибудь, как именно вы используете XSLT для шаблонизации. На каком-нибудь простом примере. Потому что я давно задумываюсь над этим, но ничего хорошего не надумал. Как добиться с его помощью усложнения, я представляю, а вот как упрощения?

    12. Сергей Чикуенок
      1 июня 2009

      Основное преимущество XSLT в том, что он изначально заточен для использования вместе с XML/xHTML.

      Возьмем ситуацию с данными, которые вносит пользователь. Например, нужно, чтобы у всех ссылок внутри тэга <blockquote> появлялись скругленные уголки (доп. элементы). Пишем простой шаблон:

      <xsl:template match="a[ancestor::blockquote]">
      	<a>
      		<xsl:copy-of select="*"/>
      		<xsl:apply-templates/>
      		<span class="cn cn-tl"></span>
      		<span class="cn cn-tr"></span>
      		<span class="cn cn-bl"></span>
      		<span class="cn cn-br"></span>
      	</a>
      </xsl:template>
      

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

      В целом, XSLT удобен именно эффективным «перехватом» XML-элементов. С грамотно составленным шаблоном можно творить чудеса. Например, я сейчас на своем проекте могу полностью поменять структуру выходного HTML-документа в зависимости от идентификатора новости, причем для этого мне достаточно всего лишь создать отдельный XSL-файл и подключить его в основной файл. При этом мне достаточно поменять пару-тройку шаблонов (<xsl:template>), все остальное автоматически будет унаследовано.

      Согласен, что XSLT — не самый простой шаблонизатор для изучения, а некоторые привычные вещи делаются там очень сложно (взять хотя бы простейший for-цикл или замену подстроки в тексте), но, тем не менее, чего-то более удобного для сайтов я пока не встречал.

    13. walek
      4 июня 2009

      >>>Посоветуйте по xsl хорошую книгу, пожалуйста

      Посоветую 3, если всерьез хотите знать XSLT.
      1. Майкл Кей, «XSLT. Справочник программиста». 2002. В бумаге найдете не найдете скорее всего, в сети возможно, сам не искал, есть в бумажном. На год не смотрите, там база дается актуальная и по сей день.
      2. «Технология XSLT», Алексей Валиков. http://xmlhack.ru/books/xslt/
      3. Мангано С. «XSLT. Сборник рецептов» http://www.books.ru/shop/books/582070 Но книга не для новичков.

      Начните с Валикова.