我喜歡認爲我對XSLT有很好的把握,但以下回避我: 爲什麼xsl:param
無法從被稱爲模板的明確聲明?換句話說,如果我叫B模版從模板:關於呼叫模板的參數中的「上下文」的含義
樣式表1
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/" name="A"><!--This template is named "A" for convenience only.-->
<xsl:param name="hello" select="hello "/>
<xsl:param name="world" select="world!"/>
<xsl:call-template name="B"/>
</xsl:template>
<xsl:template name="B">
<xsl:value-of select="concat($hello,$world)"/>
</xsl:template>
</xsl:stylesheet>
爲什麼B模版不會自動採用模板的參數作爲背景的一部分嗎?我的理由如下。
顯然,調用模板不以任何方式影響的背景下:
選定
<xsl:template>
與沒有變化的背景下評價:它使用相同的上下文項,上下文位置和上下文大小調用模板
現在,是什麼 「背景」 實際上意味着在XSLT,以上PREC isely,是否被認爲是上下文的一部分?間形成的上下文中的東西是:
- 所有變量聲明(
xsl:variable
和xsl:param
),它們在其中表達被評爲點範圍,因爲所述靜態上下文 - 的值的一部分 :在範圍上的所有變量,如動力方面
的一部分,這使我相信,下面的樣式表等於我已經展示了第一個
樣式表2
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/" name="A">
<xsl:param name="hello" select="hello "/>
<xsl:param name="world" select="world!"/>
<xsl:value-of select="concat($hello,$world)"/>
</xsl:template>
</xsl:stylesheet>
但是obvously,只有第二個是正確的,而第一個產生約缺少變量聲明兩個錯誤。爲什麼必須在調用的模板中明確聲明參數,如果模板調用不會更改上下文並且參數被視爲上下文的一部分?
爲清楚:
- 我知道如何修改第一個樣式表與
xsl:with-param
和參數聲明 - 這是不是我要求的。 - 我知道XSLT 2.0中的tunnel parameters - 你不必解釋它們或者建議它們作爲替代。我不是要求在模板中使用參數的方式,但是他們沒有聲明 - 我想知道爲什麼他們不能在第一時間使用。
1我的重點。請參閱XSLT 2.0程序員參考,Michael Kay,第273頁。
2參見規範here的相關部分或參考Michael Kay的XSLT 2.0程序員參考,頁面84f。
優秀的答案 - 我一直在等待的那個:-)。 –