我正在维护我使用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语法的信息吗?
谢谢
答案 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()
语法就可以使用了。