Как и во всех вопросах производительности, ответ будет зависеть от вашей конкретной конфигурации (в частности, используемого вами процессора XSLT) и типа обработки, которую вы выполняете.
<xsl:apply-templates>
берет последовательность узлов и проходит через них один за другим. Для каждого он находит шаблон с наивысшим приоритетом, который соответствует узлу, и вызывает его. Так что <xsl:apply-templates>
похоже на <xsl:for-each>
с <xsl:choose>
внутри, но более модульно.
Напротив, <xsl:call-template>
вызывает шаблон по имени. Нет изменений в узле контекста (без <xsl:for-each>
) и нет выбора, какой шаблон использовать.
Итак, при точно таких же обстоятельствах вы можете себе представить, что <xsl:call-template>
будет быстрее, потому что он выполняет меньше работы. Но если вы находитесь в ситуации, когда можно использовать <xsl:apply-templates>
или <xsl:call-template>
, вы, вероятно, будете делать <xsl:for-each>
и <xsl:choose>
самостоятельно, в XSLT, а не процессор, который сделает это за вас. , за кулисами. Так что, в конце концов, я думаю, что это, вероятно, уравновесит. Но, как я уже сказал, это во многом зависит от того, какую оптимизацию внедрил ваш процессор и какую именно обработку вы выполняете. Измерь это и посмотри.
Мои эмпирические правила о том, когда использовать соответствующие шаблоны и когда использовать именованные шаблоны:
- используйте
<xsl:apply-templates>
и соответствующие шаблоны, если вы обрабатываете отдельные узлы для создания результата; использовать режимы, если конкретный узел должен обрабатываться несколькими различными способами (например, в оглавлении или в теле документа)
- используйте
<xsl:call-template>
и именованный шаблон, если вы обрабатываете что-то отличное от отдельного узла, например строки или числа или наборы узлов
- (в XSLT 2.0) используйте
<xsl:function>
, если вы возвращаете атомарное значение или существующий узел