[解決済み] XSLにおける'call-template'と'apply-templates'の違いは何ですか?
質問
私は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 の本当の力があります: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 で理解すべき概念は、quot;current node" のものです。これは
<xsl:apply-templates>
では、反復ごとにカレント・ノードが移動するのに対し
<xsl:call-template>
はカレントノードを変更しない。すなわち
.
は、呼び出されたテンプレート内の
.
と同じノードを参照します。これはapply-templatesの場合ではありません。
これが基本的な違いです。テンプレートの動作に影響を与える他の側面がいくつかあります。その
mode
と
priority
の両方を持つことができるということです。
name
と
match
. また、テンプレートがインポートされているかどうかも影響します (
<xsl:import>
) かどうかにも影響します。これらは高度な使用法なので、そこに到達したときに対処することができます。
関連
-
[解決済み] XSLT v2.0 を用いて XML ファイルに schemaLocation を挿入する。
-
[解決済み] XSLT : 1から60までのループ処理
-
[解決済み] XSLで親ノードの属性を取得する
-
[解決済み] ノードに属性を追加する
-
[解決済み] XSLTにおける分割
-
[解決済み] XSLTで現在の日付を挿入することはできますか?
-
[解決済み] XSLの "contains "ディレクティブはありますか?
-
[解決済み] XSLTで文字列がヌルか空かをチェックする
-
[解決済み] XSLTで最後の要素を取得する
-
[解決済み] xsltのtest属性に2つの条件を入れることはできますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] XSLT v2.0 を用いて XML ファイルに schemaLocation を挿入する。
-
[解決済み] XSLT <xsl:if> で文字列を比較するときに "not equals to" を指定するにはどうすればよいですか?
-
[解決済み] XSLTで指定された値を持つ要素を数える
-
[解決済み] XSLで親ノードの属性を取得する
-
[解決済み] ノードに属性を追加する
-
[解決済み] XSLTにおける分割
-
[解決済み] XSLTで現在の日付を挿入することはできますか?
-
[解決済み] XSLTで文字列がヌルか空かをチェックする
-
[解決済み] XSLTで最後の要素を取得する
-
[解決済み] xsltのtest属性に2つの条件を入れることはできますか?