Подтвердить что ты не робот

Каковы различия между "шаблоном вызова" и "применением шаблонов" в XSL?

Я новичок в XSLT, поэтому я немного запутался в двух тегах,

<xsl:apply-templates name="nodes">

и

<xsl:call-template select="nodes"> 

Итак, можете ли вы перечислить разницу между ними?

4b9b3361

Ответ 1

<xsl:call-template> является близким эквивалентом вызова функции на традиционном языке программирования.

Вы можете определять функции в XSLT, как и этот простой, который выводит строку.

<xsl:template name="dosomething">
  <xsl:text>A function that does something</xsl:text>
</xsl:template>

Эта функция может быть вызвана через <xsl:call-template name="dosomething">.

<xsl:apply-templates> немного отличается, и в нем есть реальная мощность XSLT: он принимает любое количество узлов XML (независимо от того, что вы определяете в атрибуте select), итерации их (это важно: примените -templates работает как цикл!) и находит соответствующие шаблоны для них:

<!-- sample XML snippet -->
<xml>
  <foo /><bar /><baz />
</xml>

<!-- sample XSLT snippet -->
<xsl:template match="xml">
  <xsl:apply-templates select="*" /> <!-- three nodes selected here -->
</xsl:template>

<xsl:template match="foo"> <!-- will be called once -->
  <xsl:text>foo element encountered</xsl:text>
</xsl:template>

<xsl:template match="*"> <!-- will be called twice -->
  <xsl:text>other element countered</xsl:text>
</xsl:template>

Таким образом, вы отказываетесь от небольшого контроля над процессором XSLT - вы не решаете, куда идет поток программы, но процессор делает это, найдя наиболее подходящее соответствие для node, которое он в настоящее время обрабатывает.

Если несколько шаблонов могут соответствовать node, выигрывает одно с более конкретным выражением соответствия. Если существует более одного совпадающего шаблона с той же специфичностью, побеждает объявленный последний.

Вы можете больше сосредоточиться на разработке шаблонов и нуждаться в меньшем времени для "сантехники". Ваши программы станут более мощными и модульными, менее глубоко вложенными и более быстрыми (поскольку XSLT-процессоры оптимизированы для соответствия шаблонов).

Концепция понимания с XSLT - это понятие "текущий node". При <xsl:apply-templates> текущий node перемещается с каждой итерацией, тогда как <xsl:call-template> не изменяет текущий node. То есть . внутри вызываемого шаблона относится к тому же node как . в вызывающем шаблоне. Это не относится к шаблонам apply-templates.

Это основное отличие. Существуют и другие аспекты шаблонов, которые влияют на их поведение: их mode и priority, тот факт, что шаблоны могут иметь как name, так и match. Это также влияет на импорт шаблона (<xsl:import>) или нет. Это расширенное использование, и вы можете иметь дело с ними, когда вы туда попадете.

Ответ 2

Чтобы добавить к хорошему ответу @Tomalak:

Ниже приведены некоторые важные и важные отличия:

  • xsl:apply-templates намного богаче и глубже, чем xsl:call-templates и даже от xsl:for-each, просто потому, что мы не знаем, какой код будет применяться в узлах выбор - в общем случае этот код будет отличаться для различные узлы списка node.

  • Код, который будет применяться может быть записано после записи xsl:apply template и люди, которые не знают оригинального автора.

библиотека FXSL реализация функций более высокого порядка (HOF) в XSLT невозможна, если У XSLT не было команды <xsl:apply-templates>.

Резюме. Шаблоны и инструкция <xsl:apply-templates> - это то, как XSLT реализует и обрабатывает полиморфизм.

Ссылка. Смотрите эту цепочку: http://www.biglist.com/lists/lists.mulberrytech.com/xsl-list/archives/200411/msg00546.html

Ответ 3

xsl:apply-templates обычно (но не обязательно) используется для обработки всего или подмножества дочерних элементов текущего node со всеми применимыми шаблонами. Это поддерживает рекурсивность приложения XSLT, которое соответствует (возможной) рекурсивности обработанного XML.

xsl:call-template, с другой стороны, гораздо больше напоминает обычный вызов функции. Вы выполняете ровно один (именованный) шаблон, обычно с одним или несколькими параметрами.

Поэтому я использую xsl:apply-templates, если я хочу перехватить обработку интересного node и (обычно) что-то вставить в выходной поток. Типичным (упрощенным) примером будет

<xsl:template match="foo">
  <bar>
    <xsl:apply-templates/>
  </bar>
</xsl:template>

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

Изменить:

В качестве дополнительного замечания к вашему конкретному вопросу:

<xsl:call-template name="nodes"/> 

Это вызывает шаблон, который называется 'nodes':

    <xsl:template name="nodes">...</xsl:template>

Это другой семантик, чем:

<xsl:apply-templates select="nodes"/>

... который применяет все шаблоны ко всем дочерним элементам вашего текущего XML node, чье имя является "узлами".

Ответ 4

Функциональность действительно похожа (кроме семантики вызова, где call-template требуется атрибут name и соответствующий шаблон имен).

Однако синтаксический анализатор не будет работать таким же образом.

Из MSDN:

В отличие от <xsl:apply-templates>, <xsl:call-template> не изменяет текущий node или текущий node -list.