Рекурсивный вызов XSL - xsl: functions против xsl: template с шаблоном вызова - PullRequest
9 голосов
/ 29 апреля 2011

У меня есть базовый запрос.Я использую xsl: template и использую call tempate для рекурсивных вызовов шаблона.Я вижу xsl: function, которая также имеет возможность делать рекурсивные вызовы функций, такие как рекурсивные вызовы шаблонов, и достигать того же.Когда следует использовать xsl: function и когда следует использовать xsl: template.Я не уверен, какова разница между ними и когда они должны быть использованы.Каковы их особенности каждого из них.Может кто-нибудь, пожалуйста, помогите мне лучше понять это.

Ответы [ 4 ]

6 голосов
/ 01 мая 2011

Это как я ответил на аналогичный вопрос почти 3 года назад:

Преимущества использования <xsl:function/>:

  1. Композиционность.

  2. Отлично смотрится в выражении, которое использует его как параметр, как возвращаемое значение или как частичное применение.

  3. Удобочитаемость (компактность) и удобство обслуживания.

  4. Более слабая связь (не зависит от неявного узла контекста)

  5. Может указываться в выражении XPath

Недостатки:

  1. Параметры определяются только по позиции (не по имени)

  2. Может быть нечистым (может иметь побочный эффект, такой как создание нового узла (ов)), и просто взглянув на выражение, ссылающееся на эту функцию, люди могут не понять, чтоу него есть побочный эффект.Однако эту возможность путаницы можно устранить, если использовать правильное наименование.

Я обычно использую <xsl:function/>.В случаях, когда функция создает новый узел (ы), я следую соглашению начинать свое локальное имя со строки "make", как в makePerson().

. Я могу добавить только к этому:

Всегда, когда это возможно, используйте <xsl:function>.

В XPath 3.0 функции являются первоклассным типом данных языка (он же HOF - функции высшего порядка). Они могут быть переданы в качестве параметров или возвращены как результат в /из других функций.

Это невероятно мощный скачок вперед от использования именованных шаблонов.

2 голосов
/ 29 апреля 2011

Концептуально xsl:apply-templates - это карта с полиморфной функцией, выраженной для всех объявленных вами правил.xsl:function объявляет «обычную» функцию, которую вы можете использовать в любой другой инструкции или декларации, принимающей выражения XPath.xsl:call-template Инструкция «вызывает» определенный именованный шаблон (вы можете думать об этом как о функции в некотором роде).

Поскольку в этом есть различия в том, как контекст оценки задействован в каждом из них: xsl:apply-templatesопределить новый список контекста, из которого берется узел контекста, а также положение близости;xsl:function не определен узел контекста (полагаться на него - ошибка);xsl:call-template не меняет контекст оценки.

Другим очевидным отличием является их связь с выходными данными: и xsl:apply-templates, и xsl:call-template, поскольку инструкции XSLT выводят свою построенную последовательность;xsl:function как часть выражения XPath - нет.

1 голос
/ 29 апреля 2011

Я нашел ответ Димитра - http://www.stylusstudio.com/xsllist/200811/post00400.html - полезно.

Преимущества использования <xsl:function/>:

  1. Композиционность.

  2. Отлично смотрится в выражении, которое использует его как параметр, как возвращаемое значение или как частичное применение.

  3. Читаемость (компактность) и ремонтопригодность.

  4. Более слабая связь (не зависит от неявного узла контекста)

  5. Может использоваться в выражении XPath

Недостатки:

  1. Параметры определяются только по позиции (не по имени)

  2. Может быть нечистым (может иметь побочный эффект, например создавать новые узлы), и просто взглянув на выражение, ссылающееся на эту функцию, люди могут не понять, что она имеет побочный эффект.Однако эту возможность путаницы можно устранить, если использовать правильное наименование.

Я склонен всегда использовать <xsl:function/>.В случаях, когда функция создает новый узел (ы), я следую соглашению начинать свое локальное имя со строки «make», как в makePerson().

0 голосов
/ 10 мая 2014
Templates are useful when you have the requirement to store the results of each recursion into a variable as a attribute ( at the end of each recursion before calling the next ).

**Example:**

    <xsl:variable name="test">
     <record>
        <xsl:call-template name="templateRecursion">
              <xsl:with-param name="xyz" select="xyz"/>   
        </xsl:call-template>
     <record>
    </xsl:variable>

**templateRecursion:**

    <xsl:template name="templateRecursion">

    <!-- Do processing -->
     <xsl:attribute name="" value=""

    </xsl:template>

So, the variable test will have 

    <record>
     <attribute_name="" value=""/>
      .
      .
    </record>
...