Строковые ресурсы в 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>

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