0

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

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

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

下面是一些例子:

第一的:

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

第二:

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

您对这种 XPath 语法有所了解吗?

谢谢

4

2 回答 2

2

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

表达方式

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

是 a 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 无法在 .NET Core 上运行,因为它依赖于 IKVM,IKVM 不支持该平台,并且(我认为)不能轻易适应它。

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

于 2019-05-22T13:31:02.173 回答
0

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

这个:

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

更改为

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

请注意函数的附加点参数string()。这很奇怪,因为它不需要点;事实上,按照标准

在函数的零参数版本中, $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()语法就可以工作了。

于 2019-05-23T08:18:08.180 回答