разница междуа также? - PullRequest
       1

разница междуа также?

6 голосов
/ 09 декабря 2011

объясните, пожалуйста, разницу между <xsl:apply-template> и <xsl:call-template> и когда мне следует использовать <xsl:call-template>?
спасибо

Ответы [ 2 ]

11 голосов
/ 09 декабря 2011

На самом базовом уровне вы используете <xsl:apply-templates>, когда вы хотите, чтобы процессор автоматически обрабатывал узлы, и вы используете <xsl:call-template/>, когда вы хотите более точный контроль над обработкой.Так что если у вас есть:

<foo>
    <boo>World</boo>
    <bar>Hello</bar>
</foo>

И у вас есть следующий XSLT:

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

<xsl:template match="bar">
    <xsl:value-of select="."/>
</xsl:template>

<xsl:template match="boo">
    <xsl:value-of select="."/>
</xsl:template>

Вы получите результат WorldHello.По сути, вы сказали «обрабатывать такт и ускориться», а затем позволили процессору XSLT обрабатывать эти узлы, когда они сталкиваются с ними.В большинстве случаев именно так вы должны поступать в XSLT.

Иногда, тем не менее, вы хотите сделать что-то более изощренное.В этом случае вы можете создать специальный шаблон, который не соответствует ни одному конкретному узлу.Например:

<xsl:template name="print-hello-world">
    <xsl:value-of select="concat( bar, ' ' , boo )" />
</xsl:template>

И затем вы можете вызывать этот шаблон во время обработки <foo> вместо автоматической обработки дочерних узлов foo:

<xsl:template match="foo">
    <xsl:call-template name="print-hello-world"/>
</xsl:template>

В этомВ конкретном искусственном примере вы теперь получаете «Hello World», потому что вы переопределили обработку по умолчанию, чтобы делать свое дело.

Надеюсь, это поможет.

3 голосов
/ 09 декабря 2011

Не могли бы вы объяснить мне разницу между <xsl:apply-template> и <xsl:call-template> и когда мне следует использовать <xsl:call-template>?

Один может используйте <xsl:call-template>, но почти никогда должно .

В духе XSLT разрешить процессору XSLT точно определить, какой шаблон лучше всего соответствует узлу, и принять решение использовать этот шаблон для обработки этого узла,Это дает нам чистую, простую и мощную расширяемость и полиморфизм.

Как правило, сравнение xsl:apply-templates с xsl:call-template похоже на сравнение вызова виртуального метода из базового класса с вызовом непосредственного вызова не виртуального метода.

Вот некоторые важные отличия :

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

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

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

Сводка : Шаблоны и инструкция <xsl:apply-templates> - это то, как XSLT реализует и работает с полиморфизмом.Можно и нужно избегать использования xsl:call-template, который не допускает полиморфизм и ограничивает возможность повторного использования и гибкость.

Ссылка : Просмотреть всю цепочку: http://www.stylusstudio.com/xsllist/200411/post60540.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...