2012-03-30 14 views
17

XSLT 1.0では、現在のコンテキストノードを呼び出されたテンプレートに渡し、そのノードを呼び出されたテンプレート内のコンテキストノードにする方法は何ですか?XSLTコールテンプレートの現在のコンテキストを渡す

xsl:paramを持たず、空のコールテンプレートによって呼び出されたテンプレートが単に呼び出し側のコンテキストノードを取得するのであれば、いいと思いますが、空call-templateによって呼び出されていないxsl:param とを持つテンプレートは、単に拾うならばそれは(それは希望、右?)いいだろう

<xsl:template name="sub"> 
    <xsl:param name="context" /> 
    <xsl:for-each select="$context"> 

    </xsl:for-each> 
</xsl:template> 

答えて

22

<xsl:call-template name="sub"> 
     <xsl:with-param name="context" select="." /> 
    </xsl:call-template> 

呼び出し元のコンテキストノード。

これはxsl:call-templateはW3C XSLT 1.0(2.0)仕様で定義され、そして任意に準拠XSLTプロセッサによって実現される正確にどのようにです。

:希望、正しい結果がを生成さ

<t> 
<a/> 
</t> 

:この変換は、以下のXML文書に適用される場合

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="a"> 
    <xsl:call-template name="currentName"/> 
</xsl:template> 

<xsl:template name="currentName"> 
    Name: <xsl:value-of select="name(.)"/> 
</xsl:template> 
</xsl:stylesheet> 

:ここ

が小さい例であります

Name: a 
+0

ありがとうDimitre。私はこれが文書化されていないと私はそれを試したときに動作するように見えなかった。私は正しい場所を見ていないし、何か間違ったことをしているに違いない。 +1質問に答えました。乾杯。 – JPM

+0

@ JPM:どうぞよろしくお願いいたします。あなたはXSLT 2.0の 'xsl:function'命令を見ているかもしれません - 関数の呼び出し側のコンテキストを受け取らないという点で名前付きテンプレートとは異なります。呼び出し側がコンテキストノードを渡さなければならない場合このコンテキストノードを渡す必要があるかどうかをパラメータとして指定します。 –

4

ディミトレが何を言っているのか説明しているだけです。

あなたはノードからテンプレートを呼び出すと、あなたは、そのノードであり、すでに

例です:

は、このコードを前提としています

<xsl:template match="MyElement"> 
    <xsl:call-template name="XYZ"/> 
</xsl:template> 

<xsl:template name="XYZ> 
    <xsl:value-of select="."/> 
</xsl> 

上記のコードは書き込みと同じくらい良いです:

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

呼び出されたテンプレートでもfor-eachループを使用できます。 :)

ちょうどあなたが正確にどこにいるのか確かめてください。

関連する問題