parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

о user-defined функциях в xsl [письмо moko]

Александр Петросян (PAF) 22.01.2003 10:08 / 22.01.2003 10:09

From: "Konstantin Morshnev" <moko@design.ru>
Sent: Thursday, October 10, 2002 6:27 PM
Subject: о user-defined функциях в xsl

Добрый день!

Как известно, синтаскис XSL в некоторых случаях не очень удобен. В частности, конструкция аналогичная if / then / else выглядит многоэтажным монстром.

В версии XML процессора, который используется в парсере поддерживается одно из популярных расширений XSL - возможность задания пользовательских функций.

Выглядит это довольно прозрачно:
<xsl:stylesheet
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:func="http://exslt.org/functions"
         xmlns:if="http://www.atrlebedev.ru/xsl/if"
         extension-element-prefixes="func if"
         version="1.0"
 >
         <func:function name="if:def" >
                 <xsl:param name="condition" />
                 <xsl:param name="if-true" />
                 <xsl:param name="if-false" default="" />

                 <xsl:choose>
                         <xsl:when test="$condition">
                                 <func:result select="$if-true" />
                         </xsl:when>
                         <xsl:otherwise>
                                 <func:result select="$if-false" />
                         </xsl:otherwise>
                 </xsl:choose>
         </func:function>

         <xsl:template match="*" >
          <xsl:value-of select="if:def(name(.) = 'body','found','not found')" />
         </xsl:template>
Ну и в использовании, как видно, довольно просто...

На сайте http://www.exslt.org/ помимо описания расширений, которые должны поддерживаться на уровне процессора, есть еще библиотека функций, написанных как на XSLT, так и и на EXSLT, и на msxml. Например функции для работы со строками: http://www.exslt.org/str/index.html

Понятно, что в результате можно потерять одно из преимуществ XSL -
переносимость, но с другой стороны поддержка user-defined функций есть почти везде (хотя не везде эти функции пишутся на XSL). Поэтому правильнее составитьнекоторый набор расширенных функций, и пользоваться только ими.

WBR, MoKo