XML - статьи

Функции и именованные шаблоны


И XQuery, и XSLT 2.0 предоставляют возможность определять функции. Опять же, на первый взгляд эти инструменты не очень отличаются. В XQuery мы можем изменить порядок последовательности с помощью рекурсивной функции: define function reverse ($seq as item()*) as item()* {if (count($seq) < 2) then $seq else (reverse(subsequence($seq, 2)), $seq[1]) }

В XSLT 2.0 мы можем написать ту же самую функцию следующим образом: <xslt:function name="reverse" as="item()*"> <xslt:param name="seq" as="item()*"/> <xslt:sequence as="item()*" select=" if (count($seq) &lt; 2) then $seq else (reverse(subsequence($seq, 2)), $seq[1])"/> </xslt:function>

Небольшое различие. Однако тот факт, что XSLT является двухъязыковой системой, снова создает различия. Поскольку XSLT имеет один язык для создания узлов в дереве результата и другой язык (XPath) для выбора узлов из исходного дерева, то он фактически имеет два механизма для определения того, что логически является функциями: xslt:function для функций, которые могут вызываться из выражений XPath и возвращают значения; xslt:template для подпрограмм, которые можно вызывать на уровне XSLT и которые записывают узлы в дерево результата. XQuery имеет только один язык, поэтому его выражения более композиционные, а это означает, что они принимаются единственным механизмом определения функций.



Содержание раздела