支持 XPath 3.1 的 .Net 标准库

.Net standard library that supports XPath 3.1

我正在维护我工作的公司用 C# 编写的遗留工具,并将其转换为 .Net 标准 2.0。它使用 Saxon-HE 处理器来处理一些 XPaths 并替换文件中的一些配置。 它在 .NET 上的 NuGet package 具有不允许在所有 .Net 标准 2.0 兼容平台(在我的例子中是 .Net Framework 和 .Net core)上执行的依赖项,所以我需要用另一个工具替换它, 如果是标准的 .Net XPath 库就更好了。

问题是该工具使用了一些执行复杂操作的 XPath,例如连接字符串和 select 数组项,我不知道它是 Saxon 特定的语法还是标准。

了解这一点很重要,因为如果 XPath 符合某些 XPath 标准,我可以找到另一种方法来处理相同的 XPath。

这里有一些例子:

第一个:

for $row in /Item/SubItem[*]/SubSubItem return(concat($row, \"/ConcatValue\"))

第二个:

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]

您了解这种 XPath 语法吗?

谢谢

您作为示例给出的 XPath 表达式需要 XPath 2.0 处理器,但它们并非特定于 Saxon。

表达式

for $row in /Item/SubItem[*]/SubSubItem return(concat($row, \"/ConcatValue\"))

是一个ForExpression,它是XPath 2.0特有的,不容易转换为XPath 1.0,因为它的结果是一个字符串序列,而XPath 1.0中没有这种数据类型。

表达式

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]

特定于 XPath 2.0,因为它在“/”运算符的 RHS 上使用带括号的表达式;再一次,因为它 returns 一个字符串序列。

恐怕我无法告诉您 .NET Core 上是否存在 运行 的 XPath 2.0 库,我认为这是您的要求。 Saxon 无法在 .NET Core 上实现 运行,因为它依赖于 IKVM,IKVM 不支持该平台,并且(我收集的)不能轻易适应这样做。

请注意,XPath 2.0 是 XQuery 1.0 的一个子集,因此您可以将搜索扩展到 XQuery 1.0 处理器以及 XPath 2.0 处理器。

感谢 comment I was able to test XPath2.Net,现在一切正常。我只需要更改一种类型的 XPath 定义

这个:

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]

更改为

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(.), '')[1]

请注意 string() 函数的附加点参数。 这很奇怪,因为它不应该需要点;事实上,根据 standard

In the zero-argument version of the function, $arg defaults to the context item. That is, calling fn:string() is equivalent to calling fn:string(.)

但是 XPath2 抱怨这个错误

{"The function 'string'/0 was not found in namespace 'http://www.w3.org/2003/11/xpath-functions'"}

更新:

将 XPath2.Net 库更新到版本 1.0.8 后,string() 语法有效。