2013-05-10 46 views
0

在我的XML,我有這樣的事情:通XSLT元素的C#代碼

​​

我希望能夠將整個<person>部分傳遞給我的代碼隱藏,這樣在我的C#代碼,我可以訪問所有的子節點(<name>,<first>,<last>)。

我使用XSLT來生成我的HTML,並在我的XSLTfile,我有這樣一行:

<xsl:value-of select="custom:SelectPerson($selectedPerson)"/> 

這在我的代碼隱藏調用此:

public string SelectPerson(System.Xml.XPath.XPathNodeIterator selectedPersonNodes) 
{ 
    foreach (var node in selectedPersonNodes) 
    { 
     Debug.WriteLine(node.ToString()); 
    } 
    ... 
} 

我想要發生的是讓foreach循環三次,並打印出「Bob」,然後「Bobbertson」,然後「80」。但是發生的事情是它會經歷一次並打印出「BobBobbertson80」。

有沒有一種方法可以將我希望從XSLT生成的HTML傳遞到我的代碼隱藏的節點?

回答

2

你還沒有告訴我們如何$selectedPerson定義,但我會建議嘗試這一套單獨的節點傳遞給函數:

<xsl:value-of 
    select="custom:SelectPerson($selectedPerson//*[not(*)])"/> 
+0

我不知道你可以做到這一點。謝謝,這解決了我的問題! – Kalina 2013-05-13 15:52:09

2

注意,下面的C#代碼是未經測試,因爲我沒有訪問到C#開發環境。

你的C#代碼在做什麼是正確的。您正在傳遞僅包含一個節點的迭代器。 (檢查selectedPersonNodes.Count檢查)。如你所說,該節點是元素<person>,它具有後代,但它仍然是單個節點。

假設你XPathNodeIterator都不能包含多個person元素,你應該寫

foreach (var person in selectedPersonNodes) 
{ 
    Debug.WriteLine(person.SelectSingleNode("name/first").ToString()); 
    Debug.WriteLine(person.SelectSingleNode("name/last").ToString()); 
    Debug.WriteLine(person.SelectSingleNode("age").ToString()); 
} 

,或者如果它總是包含一個的人,你可以說

selectedPersonNodes.MoveNext(); 
XPathNavigator person = selectedPersonNodes.Current; 

Debug.WriteLine(person.SelectSingleNode("name/first").ToString()); 
Debug.WriteLine(person.SelectSingleNode("name/last").ToString()); 
Debug.WriteLine(person.SelectSingleNode("age").ToString()); 

但是,正如我說的在執行這些操作之前,您可能需要檢查selectedPersonNodes.Count的值。

+0

第二種解決方案適用於我,謝謝! – Kalina 2013-05-13 17:31:37