私はXSLTを初めて使用するので、2つのタグについて少し混乱しています。
<xsl:apply-templates name="nodes">
と
<xsl:call-template select="nodes">
では、それらの違いをリストアップできますか?
私はXSLTを初めて使用するので、2つのタグについて少し混乱しています。
<xsl:apply-templates name="nodes">
と
<xsl:call-template select="nodes">
では、それらの違いをリストアップできますか?
<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
両方を持つことができるという事実。テンプレートがインポートされているかどうかにも影響します()。これらは高度な使用法であり、そこに着いたときに対処できます。name
match
<xsl:import>
@Tomalakによる良い答えに追加するには:
ここにいくつかの言及されていない重要な違いがあります:
xsl:apply-templates
xsl:call-templates
xsl:for-each
選択のノードにどのコードが適用されるかわからないという理由だけで、よりも はるかに豊富で深いです。一般的な場合、このコードはノードリストのノードごとに異なります。
適用されるコードは、xsl:apply template
sが作成された後、元の作成者を知らない人が作成することができます。
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
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ノードのすべての子にすべてのテンプレートを適用します。
機能は確かに似ています(属性と対応する名前テンプレートがcall-template
必要な呼び出しセマンティクスを除いて)。name
ただし、パーサーは同じ方法で実行されません。
MSDNから:
とは異なり
<xsl:apply-templates>
、<xsl:call-template>
現在のノードまたは現在のノードリストは変更されません。