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