Главная » XSLT » Преобразование простых именованных шаблонов в функции XSLT

0

Задача

В XSLT 1.0 не было поддержки для написания функций, а именованные шаб­лоны – не слишком удачная замена.

Решение

Если нужно всего лишь вычислить результат, а не породить новое сериализо- ванное содержимое, отдавайте предпочтение функциям XSLT 2.0. Ниже приведе­ны разнородные примеры ситуаций, когда функции гораздо удобнее именован­ных шаблонов:

<!– Maтeмaтичecкиe вычиcлeния –>

<xsl:function name="ckbk:factorial" as="xs:decimal"> <xsl:param name="n" as="xs:integer"/> <xsl:sequence select="if ($n eq 0) then 1

else $n * ckbk:factorial($n – 1)"/>

</xsl:function>

<!– Пpocтыe oтoбpaжeния –>

<xsl:function name="ckbk:decodeColor" as="xs:string"> <xsl:param name="colorCode" as="xs:integer"/> <xsl:variable name="colorLookup"

select="(‘black,,,red,,,orange,,,yellow’,

,green’,,blue,,,indigo,,,violet,,,white)"/>

<xsl:sequence select="if ($colorCode ge 0 and

$colorCode lt count($colorLookup)) then $colorLookup[$colorCode – 1] else ‘no color’"/>

</xsl:function>

<!– Maнипyляции со cтpoкaми –>

<xsl:function name="ckbk:reverse">

<xsl:param name="input" as="xs:string"/> <xsl:sequence select="codepoints-to-string(reverse(

string-to-codepoints($input)))"/>

</xsl:function>

Обсуждение

Напомним, что именованные шаблоны – альтернатива шаблонам, вызывае­мым в результате успешного сопоставления с образцом. Их можно уподобить процедурам в традиционных языках, поскольку программист явно передает уп­равление именованному шаблону командой xsl:call-template, а не полагает­ся на декларативную семантику сопоставления. Приятной особенностью XSLT (в обеих версиях) является тот факт, что один и тот же шаблон можно вызывать как в результате сопоставления, так и по имени.

Определяемые пользователем функции в XSLT 2.0 – не замена именованным шаблонам. Главный вопрос, который нужно задать себе, выбирая то или другое, звучит так: «Я собираюсь просто вычислить результат или создать повторно ис­пользуемый генератор содержимого?» В первом случае лучше воспользоваться функцией, а во втором – шаблоном. В книге XSLT Programmer’s Reference Майкл Кэй рекомендует использовать функции, когда вы просто отбираете узлы, а шаб­лоны – когда создаете новые узлы, несмотря даже на то, что XSLT допускает при­менение функций и во втором случае.

Следующая функция отбирает узлы:

<xsl:function name="getParts" as="item()*">

<xsl:param name="startPartId" as="xs:string"/> <xsl:param name="endPartId" as="xs:string"/> <xsl:sequence select="//Parts/part[@partId ge $startPartId

and @partId le $endPartId]"/>

</xsl:function>

А эта функция создает новые узлы, но шаблон, пожалуй, был бы здесь уместнее:

<xsl:function name="getPartsElem" as="item()">

<xsl:param name="startPartId" as="xs:string"/> <xsl:param name="endPartId" as="xs:string"/> <Parts>

<xsl:copy-of select="//Parts/part[@partId ge $startPartId

and @partId le $endPartId]"/>

</Parts>

</xsl:function>

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии