<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 - не вы решаете, куда движется программа, а процессор, находя наиболее подходящее соответствие для узла, который он обрабатывает в настоящее время.
Если узлу может соответствовать несколько шаблонов, то побеждает тот, у которого более специфическое выражение соответствия. Если существует более одного соответствующего шаблона с одинаковой специфичностью, победит тот, который объявлен последним.
Вы можете больше сосредоточиться на разработке шаблонов, и вам понадобится меньше времени, чтобы заняться "слесарным делом". Ваши программы станут более мощными и модульными, менее глубоко вложенными и более быстрыми (поскольку процессоры XSLT оптимизированы для соответствия шаблонам).
Концепция XSLT для понимания - это понятие "текущий узел". При <xsl:apply-templates>
текущий узел перемещается с каждой итерацией, тогда как <xsl:call-template>
не изменяет текущий узел. То есть .
в вызываемом шаблоне относится к тому же узлу, что и .
в вызывающем шаблоне. Это не относится к apply-шаблонам.
В этом основная разница. Существуют и другие аспекты шаблонов, которые влияют на их поведение: их mode
и priority
, тот факт, что шаблоны могут иметь как name
, так и match
. Это также влияет на то, был ли шаблон импортирован (<xsl:import>
) или нет. Это расширенные возможности, и вы можете справиться с ними, когда попадете туда.