125

私はXSLTを初めて使用するので、2つのタグについて少し混乱しています。

<xsl:apply-templates name="nodes">

<xsl:call-template select="nodes"> 

では、それらの違いをリストアップできますか?

4

4 に答える 4

176

<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属性で定義したもの)を取り、それぞれを処理します(必ずしも事前定義された順序である必要はありません)。誰かがapply-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-templatesには当てはまりません。

これが基本的な違いです。テンプレートには、その動作に影響を与える他のいくつかの側面があります。それらmodeと、、テンプレートがaと。のpriority両方を持つことができるという事実。テンプレートがインポートされているかどうかにも影響します()。これらは高度な使用法であり、そこに着いたときに対処できます。namematch<xsl:import>

于 2010-12-18T13:02:25.997 に答える
16

@Tomalakによる良い答えに追加するには:

ここにいくつかの言及されていない重要な違いがあります

  1. xsl:apply-templatesxsl:call-templatesxsl:for-each選択のノードにどのコードが適用されるかわからないという理由だけで、よりはるかに豊富で深いです。一般的な場合、このコードはノードリストのノードごとに異なります。

  2. 適用されるコードは、xsl:apply templatesが作成された後、元の作成者を知らない人が作成することができます。

XSLTに命令がない場合、FXSLライブラリによるXSLTでの高階関数(HOF)の実装は不可能<xsl:apply-templates>です。

概要:テンプレートと<xsl:apply-templates>命令は、XSLTがポリモーフィズムを実装および処理する方法です。

参照:このスレッド全体を参照してください:http://www.biglist.com/lists/lists.mulberrytech.com/xsl-list/archives/200411/msg00546.html

于 2010-12-18T17:38:31.140 に答える
9

xsl:apply-templates通常(必ずしもそうとは限りませんが)、現在のノードの子のすべてまたはサブセットを、該当するすべてのテンプレートで処理するために使用されます。これは、処理されたXMLの(可能な)再帰性と一致するXSLTアプリケーションの再帰性をサポートします。

xsl:call-template一方、通常の関数呼び出しに非常に似ています。通常は1つ以上のパラメーターを使用して、1つの(名前付き)テンプレートを実行します。

したがってxsl:apply-templates、関心のあるノードの処理をインターセプトし、(通常は)出力ストリームに何かを注入する場合に使用します。典型的な(簡略化された)例は次のようになります

<xsl:template match="foo">
  <bar>
    <xsl:apply-templates/>
  </bar>
</xsl:template>

一方、xsl:call-template私は通常、いくつかのサブノードのテキストを一緒に追加したり、選択したノードセットをテキストや他のノードセットに変換したりするなどの問題を解決します。

編集:

あなたの特定の質問テキストへの追加のコメントとして:

<xsl:call-template name="nodes"/> 

これは、「ノード」という名前のテンプレートを呼び出します。

    <xsl:template name="nodes">...</xsl:template>

これは、次とは異なるセマンティクスです。

<xsl:apply-templates select="nodes"/>

...これは、名前が「nodes」である現在のXMLノードのすべての子にすべてのテンプレートを適用します。

于 2010-12-18T13:08:12.217 に答える
2

機能は確かに似ています(属性と対応する名前テンプレートがcall-template必要な呼び出しセマンティクスを除いて)。name

ただし、パーサーは同じ方法で実行されません。

MSDNから:

とは異なり<xsl:apply-templates><xsl:call-template>現在のノードまたは現在のノードリストは変更されません。

于 2010-12-18T12:42:52.387 に答える