XSLT 処理では、apply-template と call-template のパフォーマンスに違いはありますか? 私のスタイルシートには、どちらかを使用できる多くのインスタンスがありますが、どちらが最良の選択ですか?
3 に答える
すべてのパフォーマンスに関する質問と同様に、答えは特定の構成 (特に使用している XSLT プロセッサ) と実行している処理の種類によって異なります。
<xsl:apply-templates>
一連のノードを取り、それらを 1 つずつ調べます。それぞれについて、ノードに一致する優先度が最も高いテンプレートを見つけて、それを呼び出します。これ<xsl:apply-templates>
は のようなものです<xsl:for-each>
が<xsl:choose>
、よりモジュール化されています。
対照的に<xsl:call-template>
、テンプレートを名前で呼び出します。コンテキスト ノードに変更はなく ( no <xsl:for-each>
)、使用するテンプレートを選択することもできません。
<xsl:call-template>
したがって、まったく同じ状況で、作業が少ないため、より高速になると想像するかもしれません。しかし、どちらかまたはのいずれ<xsl:apply-templates>
かを使用できる状況にある場合、プロセッサーが舞台裏で実行するのではなく、XSLT で自分自身で実行<xsl:call-template>
することになるでしょう。だから最終的にはバランスが取れていると思います。しかし、私が言ったように、それはプロセッサが行った最適化の種類と、正確にどのような処理を行っているかに大きく依存します. 測って見てください。<xsl:for-each>
<xsl:choose>
一致するテンプレートを使用する場合と名前付きテンプレートを使用する場合についての私の経験則は次のとおりです。
- 個々のノードを処理して結果を作成する場合は、テンプレートを使用
<xsl:apply-templates>
して一致させます。特定のノードをいくつかの異なる方法で処理する必要がある場合は、モードを使用します (目次とドキュメントの本文など)。 <xsl:call-template>
文字列や数値、ノードのセットなど、個々のノード以外のものを処理する場合は、名前付きテンプレートを使用します- (XSLT 2.0 で)
<xsl:function>
原子値または既存のノードを返す場合に使用します。
apply-template と call-template は同じタスクを実行しません。パフォーマンスの比較はここではあまり関係ありません。call-template はテンプレート名をパラメーターとして受け取りますが、apply-template は xpath 式を受け取ります。したがって、どのテンプレートが実行されるかわからないため、apply-template ははるかに強力です。複雑な xpath 式を使用すると、パフォーマンスの問題が発生します。入力ドキュメントのすべてのノードが評価されるため、xpath 式で「//」を使用しないでください。
使用しているxmlパーサーによって異なる場合があります。プッシュとプルのXSLTコードで非公式のパフォーマンステストを行った.NET2003パーサー以外は何も言えません。これはあなたが求めているものに似ています:apply-template=pushとcall-template=pull。プッシュの方が速いと確信していましたが、そうではありませんでした。ほぼ均等でした。
申し訳ありませんが、現在正確なテストはありません。選択したパーサーで試して、大きな違いがあるかどうかを確認することをお勧めします。私の賭けはありません。