Так вот, эти функции можно вызывать из XSLT функций. В зависимости от ваших целей, вы можете вызывать эти функции до, во время или после того, как XSLT будет выполнен.
Рассмотрим каждый вариант.
До
Чтобы выполнить функцию и воспользоваться ее результатом до выполнения XSLT, нужно добавить ее в редакторе XSLT функции на вкладке “Вызов функций”.
Когда вы добавляете вызов такой функции, ее результат можно посмотреть в предварительном просмотре (вкладка “Просмотр”) в разделе “Ввод”.
XML, который там отображается можно использовать в вашем XSLT.
После
Функцию, можно добавить и непосредственно в ваш XSLT на вкладке “Шаблон” (Добавить | Код функции). В этом случае, вызванная C1 функция отработает после выполнения вашего XSLT.
Пример:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xsl f">
<xsl:template match="/">
<html>
<head />
<body>
<xsl:variable name="daystoadd" select="1" />
<function name="Composite.Utils.Date.AddDays" xmlns="http://www.composite.net/ns/function/1.0">
<param name="DaysToAdd" value="{$daystoadd}" />
</function>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="/">
<html>
<head />
<body>
<xsl:variable name="daystoadd" select="1" />
<function name="Composite.Utils.Date.AddDays" xmlns="http://www.composite.net/ns/function/1.0">
<param name="DaysToAdd" value="{$daystoadd}" />
</function>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
В данном примере добавлен вызов функции, которая покажет дату завтрашнего дня, используя динамическая составляющая - переменная $daystoadd.
Переключившись в предварительный просмотр (вкладка “Просмотр”) в разделе “Вывод” можно проверить, как именно будет включена добавленная С1 функция.
Пример:
<html xmlns="http://www.w3.org/1999/xhtml">
<head />
<body>
<function name="Composite.Utils.Date.AddDays" xmlns="http://www.composite.net/ns/function/1.0">
<param name="DaysToAdd" value="1" />
</function>
</body>
</html>
<head />
<body>
<function name="Composite.Utils.Date.AddDays" xmlns="http://www.composite.net/ns/function/1.0">
<param name="DaysToAdd" value="1" />
</function>
</body>
</html>
Благодаря обработке динамических составляющих, можно выстраивать целую иерархию вызовов C1 функций - используя вызов функции (дочерней) в качестве значения для параметра другой функции (родительской)
<f:function name="Shop.Presentation.ListMinimizer" xmlns:f="http://www.composite.net/ns/function/1.0">
<f:param name="Style" value="Compact" />
<f:param name="ItemRenderings">
<for-each select="$shoppingbasket/Product" xmlns="http://www.w3.org/1999/XSL/Transform">
<f:function name="Shop.Presentation.ProductListItem">
<f:param name="ProductId" value="{@ProductId}" />
</f:function>
</for-each>
</f:param>
</f:function>
<f:param name="Style" value="Compact" />
<f:param name="ItemRenderings">
<for-each select="$shoppingbasket/Product" xmlns="http://www.w3.org/1999/XSL/Transform">
<f:function name="Shop.Presentation.ProductListItem">
<f:param name="ProductId" value="{@ProductId}" />
</f:function>
</for-each>
</f:param>
</f:function>
Во время
Выполнение же C1 функции во время выполнения XSLT - то есть в на определенном шаге выполнения XSLT - требует дополнительных шагов.
Во-первых, вам нужно воспользоваться специальной функцией из специального пространства имен, чтобы сделать вызов функиции.
Во-вторых, вам нужно саму функцию оформить как переменную, и вызывать эту функцию через эту переменную.
Итак:
- Добавьте такое пространство имен в ваш XSLT: xmlns:c1="http://c1.composite.net/StandardFunctions"
- Добавьте переменную для вызова вашей функции, напр.:
<xsl:variable name="SendMailFunction">
</xsl:variable>
- В качестве значения переменной (между тегами <xsl:variable></xsl:variable>) сделайте вызов функции через меню Добавить | Код функции, напр: функцию Composite.Mail.SendMail
- … и если нужно установите значения для ее параметров.
- Далее вызывайте функцию при помощи c1:CallFunction(), передавая в качестве параметра имя переменной для вызова функции.
CallFunction вернет значение такого же типа, как и сама функция. И вы можете использовать это значение далее в вашем XSLT. Наиболее употребительные типы -это XElement, XhtmlDocument, IEnumerable<XElement>, string, int и bool.
Пример:
<xsl:template match="User" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="SendMailFunction">
<function name="Composite.Mail.SendMail" xmlns="http://www.composite.net/ns/function/1.0">
<param name="From" value="us@bazinga.com" />
<param name="To" value="{@EMail}" />
<param name="Subject" value="Hello {@Name}" />
<param name="IsHtml" value="false" />
<param name="Body">Hello there...</param>
</function>
</xsl:variable>
<xsl:variable name="emailSentSuccessfully" select="c1:CallFunction($SendMailFunction)" />
<xsl:if test="$emailSentSuccessfully=false"> Error sending mail... </xsl:if>
</xsl:template>
<xsl:variable name="SendMailFunction">
<function name="Composite.Mail.SendMail" xmlns="http://www.composite.net/ns/function/1.0">
<param name="From" value="us@bazinga.com" />
<param name="To" value="{@EMail}" />
<param name="Subject" value="Hello {@Name}" />
<param name="IsHtml" value="false" />
<param name="Body">Hello there...</param>
</function>
</xsl:variable>
<xsl:variable name="emailSentSuccessfully" select="c1:CallFunction($SendMailFunction)" />
<xsl:if test="$emailSentSuccessfully=false"> Error sending mail... </xsl:if>
</xsl:template>
В данном примере, мы инициализируем некоторые параметры функции SendMail при помощи динамических значений. Так как функция возвращает значение логического типа, мы проверяем его и используем далее в коде.
(Написано по мотивам статьи на официальном сайте Composite C1: Calling C1 Functions. Примеры взяты из статьи.)
Комментариев нет:
Отправить комментарий