1. ホーム
  2. xslt

[解決済み] XSLにおける'call-template'と'apply-templates'の違いは何ですか?

2022-08-06 14:18:26

質問

私は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の場合ではありません。

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