33

XSLT 処理では、apply-template と call-template のパフォーマンスに違いはありますか? 私のスタイルシートには、どちらかを使用できる多くのインスタンスがありますが、どちらが最良の選択ですか?

4

3 に答える 3

58

すべてのパフォーマンスに関する質問と同様に、答えは特定の構成 (特に使用している 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>原子値または既存のノードを返す場合に使用します。
于 2008-09-17T17:16:08.320 に答える
10

apply-template と call-template は同じタスクを実行しません。パフォーマンスの比較はここではあまり関係ありません。call-template はテンプレート名をパラメーターとして受け取りますが、apply-template は xpath 式を受け取ります。したがって、どのテンプレートが実行されるかわからないため、apply-template ははるかに強力です。複雑な xpath 式を使用すると、パフォーマンスの問題が発生します。入力ドキュメントのすべてのノードが評価されるため、xpath 式で「//」を使用しないでください。

于 2008-09-17T15:37:23.520 に答える
4

使用しているxmlパーサーによって異なる場合があります。プッシュとプルのXSLTコードで非公式のパフォーマンステストを行った.NET2003パーサー以外は何も言えません。これはあなたが求めているものに似ています:apply-template=pushとcall-template=pull。プッシュの方が速いと確信していましたが、そうではありませんでした。ほぼ均等でした。

申し訳ありませんが、現在正確なテストはありません。選択したパーサーで試して、大きな違いがあるかどうかを確認することをお勧めします。私の賭けはありません。

于 2008-09-17T15:47:58.597 に答える