2011-12-09 8 views
6

<xsl:apply-template><xsl:call-template>の違いを教えてください。いつ<xsl:call-template>を使用しますか?
を使用すると、自動的にプロセッサハンドルノードを聞かせたいときに<xsl:apply-templates>を使用し、非常に基本的なレベルでは、あなた<xsl:apply-template>と<xsl:call-template>の違いは?

答えて

11

に感謝し、あなたが処理をより細かく制御したいときは、<xsl:call-template/>を使用しています。だから、あなたが持っている場合:

<foo> 
    <boo>World</boo> 
    <bar>Hello</bar> 
</foo> 

をし、次のXSLT持っている:あなたは結果WorldHelloを取得します

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

<xsl:template match="bar"> 
    <xsl:value-of select="."/> 
</xsl:template> 

<xsl:template match="boo"> 
    <xsl:value-of select="."/> 
</xsl:template> 

を。本質的に、あなたは「バーとブーをこの方法で処理する」と言ってきました。そして、XSLTプロセッサがこれらのノードを処理するようにしました。ほとんどの場合、XSLTでこれを行う方法です。

しかし、時には、あなたは何か好きなことをしたいと思っています。その場合、特定のノードと一致しない特別なテンプレートを作成することができます。あなたが<foo>を処理するのではなく、自動的にfooの子ノードを処理しているときには、このテンプレートを呼び出すことができます

<xsl:template name="print-hello-world"> 
    <xsl:value-of select="concat(bar, ' ' , boo)" /> 
</xsl:template> 

そして:たとえば

<xsl:template match="foo"> 
    <xsl:call-template name="print-hello-world"/> 
</xsl:template> 

この特定の人工的な例では、あなたが今 "を得ますあなた自身のことをするデフォルトの処理をオーバーライドしているからです。

希望に役立ちます。

+0

これまでのところ、これは私が今までXSLTに読んだ最高の説明です(私は、XSLTを追加する必要がありますが、私のものではありませんん、そしておそらく決して。されます) –

3

あなたは私の <xsl:apply-template><xsl:call-template>とするとき、私は <xsl:call-template>を使用する必要があるとの違いを説明してくださいますか?

一つ<xsl:call-template>しかし、ほとんど決してべきを使用することができます。

それは、XSLTプロセッサが正確に決定できるようにするためにXSLTの精神であるテンプレートベストマッチノードと、そのノードを処理するために、このテンプレートを使用することを決定します。これにより、クリーンで簡単で強力な拡張性と多形性が得られます。

一般に、xsl:apply-templatesからxsl:call-templateを比較することは、基本クラスからの仮想メソッドの呼び出しを、非仮想メソッドを直接呼び出す方法と比較することと似ています。

  1. xsl:apply-templatesは、我々はのノードに適用されるどのようなコードを知らないという理由だけでxsl:call-templatesよりもはるかに豊かで深いとさえxsl:for-eachから、:ここ

    は、いくつかの重要な違いです 選択 - 一般的なケースでは、このコードはノードリストの異なるノード で異なるでしょう。

  2. xsl:apply-templatesを書かれ、元の作者を知らない 人々によって後 が道を書き込むことができます適用されるコード。 XSLTは<xsl:apply-templates>命令を持っていなかった場合はXSLTで高次関数(HOF)の

FXSL libraryの実装は不可能であろう。

要約:テンプレートと<xsl:apply-templates>命令は、XSLTが多態性を実装し、扱う方法です。ポリモフィズムを許さず、再利用性と柔軟性を制限するxsl:call-templateの使用を避けてください。

リファレンス:この全体のスレッドを参照してください:http://www.stylusstudio.com/xsllist/200411/post60540.html

関連する問題