Посты с тэгом «entity»

  • Подключение 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>
    
    Метки: , ,