支持XPath 3.1的.Net标准库

时间:2019-05-22 09:04:03

标签: xpath xquery saxon xquery-3.1 xpath-3.1

我正在维护我使用C#编写的公司的旧版工具,并将其转换为.Net标准2.0。它使用Saxon-HE处理器来处理某些XPath并替换文件中的某些配置。 它在.NET上的NuGet package具有依赖关系,因此不允许在所有.NET Standard 2.0兼容平台(在我的情况下是.Net Framework和.Net core)上执行,因此我需要用另一种工具替换它,最好使用标准的.Net XPath库。

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

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

以下是一些示例:

第一:

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

第二:

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

您了解有关这种XPath语法的信息吗?

谢谢

2 个答案:

答案 0 :(得分:2)

您作为示例给出的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上使用带括号的表达式;再次,因为它返回了一个字符串序列。

恐怕我不能建议您是否存在在.NET Core上运行的XPath 2.0库,我认为这是您的要求。由于Saxon依赖IKVM,因此无法使其在.NET Core上运行。IKVM不支持该平台,并且(我搜集到的)不易适应该平台。

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

答案 1 :(得分:0)

感谢this评论,我能够测试XPath2.Net,现在一切正常。我只需要更改一种XPath定义

这个:

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

更改为

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

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

  

在函数的零参数版本中,$ arg默认为   上下文项。也就是说,调用fn:string()等效于调用   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()语法就可以使用了。