2012-09-13 38 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)