我正在维护我为C#编写的公司的旧工具,并且将其转换为.NET标准2.0。它使用撒克逊人-HE处理器处理一些XPATH并替换文件中的某些配置。它的.NET上的Nuget软件包具有依赖项,不允许在所有.NET标准2.0符合条件的平台上执行执行(在我的情况下,.NET Framework和.NET Core(,因此我需要将其替换为彼此的工具,如果更好的话,如果标准.NET XPATH库。
问题在于该工具使用了一些执行复杂操作的XPath,例如连接字符串并选择一个数组项目,我不知道它是撒克逊人特定的语法或标准。
。重要的是要知道这一点,因为如果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处理器,但它们不是撒克逊人的特定。
表达式
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的,因为它在"/quot"的Rhs上使用括号表达式。操作员;再一次,因为它返回一系列字符串。
恐怕我无法告知您是否存在在.NET Core上运行的XPath 2.0库,我认为这是您的要求。由于IKVM的依赖性,撒克逊人无法在.NET核心上运行,该核心不支持该平台,并且(我收集(无法轻易适应。
请注意,XPath 2.0是XQUERY 1.0的子集,因此您可以将搜索扩展到XQUERY 1.0处理器以及XPath 2.0处理器。
== 2023 UPDATE ==
saxoncs 11.x,然后在.net core
多亏了此评论,我能够测试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()
语法作品。