2

我正在使用 .net 4.0

我怎样才能重写以下xpath,才能有效

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

我收到此错误:

需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。

我不知道如何使用XmlNamespaceManager解决这个问题,我需要添加哪个命名空间...

如果我这样做,它会起作用:

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

但我需要它是小写比较。

这是组合的上下文:

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

请注意,我们可以将 XPathSelectElements 的第二个参数传递给 XmlNamespaceManager

编辑 这是带有翻译功能的工作示例:

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

1 回答 1

5

lower-case()是一个标准的 XPath 2.0 函数,仅在 XSLT 2.0 处理器中实现

要“按原样”运行您的代码,您需要一个 XSLT 2.0 处理器。有两个著名的 XSLT 2.0 处理器被开发用于 .NET:

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

请注意

可以从标准 XPath 2.0 函数的名称中省略名称空间前缀,因为 XSLT 处理器为所有无前缀的函数名称使用正确的默认名称空间。

因此,只需编写:

lower-case(./Link)

代替:

fn:lower-case(./Link)
于 2012-09-13T13:32:37.850 回答