2009-12-29 40 views
1

我從C#傳遞參數到xsl在<xsl: for each>但我沒有得到輸出。 這裏是我的代碼至今問題在傳遞參數<xsl:每個

<xsl:param name="xpath" select="sessions/session"/> 
<xsl:template match="/"> 
    <xsl:value-of select="$xpath"/> 
    <xsl:for-each select="exsl:node-set($xpath)"> 

,並轉化蒙山

XslCompiledTransform xslt = new XslCompiledTransform(); 
XsltArgumentList xsArgs = new XsltArgumentList(); 
xslt.Load(strXstFile); 

//creating xpath through some logic , it is working fine 
xsArgs.AddParam("xpath", "", xpath); 

MemoryStream ms = new MemoryStream(); 
XmlTextWriter writer = new XmlTextWriter(ms, Encoding.ASCII); 
StreamReader rd = new StreamReader(ms); 
xslt.Transform(doc, xsArgs, writer); 

我通過檢查值和值都完美,但經過我想,當我採用t下襬在XSL:的foreach它沒有顯示我預期的結果。以前當我沒有使用exsl:node-set時,它拋出錯誤,所以我使用它,但我想這是讓我的字符串別的東西。

任何想法如何解決這個問題?

+1

您的示例看起來不完整。你在哪裏使用?你在使用exsl之前得到了什麼錯誤? – 2009-12-29 10:08:13

+0

抱歉Idk y它沒有顯示,但現在你看到我基本上想要基於xpath值進行過濾。我得到錯誤「表達式必須評估爲一個節點集」如果我單獨使用$ xpath而無需exsl – TSSS22 2009-12-29 10:19:15

回答

3

我懷疑你是錯誤的理解,你可以設置一個參數或變量爲一個字符串,然後使用該字符串作爲XPath查詢。你不能。

此:

<xsl:param name="xpath" select="sessions/session"/> 

創建一個名爲xpath參數,並將其設置在默認情況下,一個節點集。由於上下文節點是根節點,因此如果輸入文檔的頂層元素的名稱爲sessions並且它至少有一個session子元素,則節點集將只包含任何內容。

以下是$xpath不包含的內容:XPath表達式。

如果在您的C#代碼中將該參數設置爲包含XPath表達式的字符串,則不包含節點集,而是包含一個字符串。這:

<xsl:value-of select='$xpath'/> 

將發出該字符串,而這個:

<xsl:for-each select='exsl:node-set($xpath)'> 

不會做任何事情,因爲node-set函數需要它的參數是一個結果樹片段,並$xpath包含一個字符串。

我敢打賭,你真正想要做的是更多的東西是這樣的:從xpath更改參數的名稱不太誤導性的東西,像nodeset,並創建節點設置你的C#代碼:

xsArgs.AddParam("nodeset", "", doc.SelectNodes(xpath)); 
+1

動態評估XPath表達式對於(「實驗性」)擴展函數「dyn:evaluate(strXPathExpression)」似乎是可能的。見http://www.exslt.org/dyn/functions/evaluate/index.html – 2009-12-29 12:04:56

+0

你是禮儀羅伯特多數民衆贊成我所做的錯了。我爲字符串分配參數,但你是禮節我需要在我的C#代碼中創建節點集..現在工作正常....非常感謝.... – TSSS22 2009-12-29 14:12:00