2012-09-13 42 views
1

我使用.NET 4.0使用XSLT小寫功能

我怎麼可以重寫下面的XPath,爲有效

//Menu[fn:lower-case(./Link) = 'xyxysyx'] 

我收到此錯誤:

Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.

我不知道如何解決這個問題XmlNamespaceManager我需要添加哪個命名空間...

,如果我做這樣的工作原理:

//Menu[./Link = 'xyxysyx'] 

,但我需要的是小寫比較。

這裏是哪裏,這是結合上下文:

IEnumerable<System.Xml.Linq.XElement> menus = xml.Root.XPathSelectElements(xpath, namespaceManager); 

注意,我們可以通過XPathSelectElements塞康參數,它是XmlNamespaceManager的

編輯 與翻譯功能在這裏工作例如:

//Menu[translate(./Link, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'yz'] 
+0

你嘗試這樣'//Menu[lower-case(./Link)= 'xyxysyx']'。同樣在你的代碼中,結束方括號缺失 – Jayy

+3

可悲的是,你不能感謝微軟沒有真正推進對XSLT的支持。請參閱http://stackoverflow.com/questions/4125130/namespaces-for-xslt-using-net的替代方案(這也是我投票結束的原因)。 – dash

+0

我忘了寫在這裏,但它存在,現在我將編輯帖子 –

回答

4

lower-case()是標準的XPath 2.0函數,僅在XSLT 2.0處理器中實現。

要「按原樣」運行代碼,您需要XSLT 2.0處理器。有兩個在.NET開發使用知名XSLT 2.0處理器:

  1. Saxon 9.x for .NET(Saxon.NET)
  2. XQSharp

請注意

命名空間前綴可以從標準XPath 2.0函數的名稱中省略,因爲XSLT處理器對所有無前綴的函數名稱使用正確的默認名稱空間。

因此,只寫:代替

lower-case(./Link) 

fn:lower-case(./Link)