• Техногрет
  • Строковые ресурсы в XSLT-шаблонах

    HTML и CSSXSLTJavaScriptИзображенияСофтEtc
    Андрей Шитов

    2 декабря 2005


    Задача. Напомнить о возможностях функции document().

    Функцией document() обычно пользуются, чтобы получить доступ к другому файлу. Однако не все помнят (а некоторые и не подозревают), что этой же функцией можно получить весь текущий XSLT-шаблон. Тот шаблон, из которого происходит вызов функции.

    Достаточно написать document('').

    Совместимость

    Эту возможность одинаково хорошо поддерживают популярные XSLT-процессоры libxslt и msxsl.

    Для примера рассмотрите XSLT-шаблон, который формирует название месяца в виде строки, получая на входе такой XML-код:

    <?xml version="1.0" encoding="Windows-1251"?>
    <date year="2005" month="12" day="2"/>
    

    Строковые ресурсы хранятся непосредственно в файле XSLT. Чтобы получить их, потребуется дописать простое XPath-выражение document('')/xsl:stylesheet/... по обычным правилам.

    <?xml version="1.0" encoding="Windows-1251"?>
    <xsl:stylesheet
    	version="1.0"
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    	xmlns:als="http://www.artlebedev.ru/xsl">
    	<xsl:template match="/">	
    		<xsl:value-of select="date/@day"/>
    		<xsl:text> </xsl:text>
    		<xsl:value-of
    			select="document('')/xsl:stylesheet/als:strings/months/item
    			[position() = current()/date/@month]/text()"/>
    		<xsl:text> </xsl:text>
    		<xsl:value-of select="date/@year"/>
    	</xsl:template>
    	<als:strings>
    		<months>
    			<item>января</item>
    			<item>февраля</item>
    			<item>марта</item>
    			<item>апреля</item>
    			<item>мая</item>
    			<item>июня</item>
    			<item>июля</item>
    			<item>августа</item>
    			<item>сентября</item>
    			<item>октября</item>
    			<item>ноября</item>
    			<item>декабря</item>
    		</months>
    	</als:strings>
    </xsl:stylesheet>
    

    Следует лишь обратить внимание на необходимость указывать собственное пространство имен.