2011-02-17 35 views
2

在我的XSLT文件我有以下幾點:傳遞一個參數有關申請一個模板選擇XLST,.NET

<xsl:param name="predicate" select="//Event" /> 
<xsl:apply-templates select="$predicate" /> 

而且能正常工作,但現在我想帕拉姆從改變我.net代碼。

var args = new XsltArgumentList(); 
args.AddParam("predicate", "", "//Event[@valid]"); 
xmlviewer.TransformArgumentList = args; 

,但不管是什麼我通過在謂詞,我得到的錯誤「表達式必須節點集。」

有沒有辦法將xpath選擇器傳入轉換?

+0

好問題,+1。請參閱我的答案以獲得解釋和完整解決方案。 :) – 2011-02-17 22:01:26

+0

請注意,爲了在調用時將其值傳遞給XSLT處理器,該參數聲明必須是頂級參數聲明。 – 2011-02-17 22:03:35

回答

0
args.AddParam("predicate", "", "//Event[@valid]"); 

你逝去的只是一個字符串的樣式,但樣式表使用predicate參數作爲節點集 - 它完成它的<xsl:apply-templates>

解決方案

評估XPath表達式現在你傳遞一個字符串。例如,使用Select()方法XPathNavigator。然後作爲參數傳遞給結果XPathNodeIterator

0

最終,$predicate這裏是"//Event[@valid]" - 你已經基本上完成:

<xsl:apply-templates select="'//Event[@valid]'"/> 

即試圖評估一個字符串的模板。這是行不通的。您可以,然而,測試@valid,例如

<xsl:param name="valid" select="" /> 
<xsl:apply-templates select="//Event[@valid=$valid]" /> 

當然,因爲XSLT是XML,另一種方式來處理,這將是對XSLT加載到DOM和更換執行前的xpath表達式。

相關問題