XPath小写()函数

我正在使用XPATH从XML文档中选择某些节点。

用户可以插入该位置的值。 它工作正常,但如果使用不同的情况则不起作用。

我已经决定在比较之前将XML值和用户输入更改为小写可能是最好的方法。

我现在有这个作为我的选择器:

NodeIter = nav.Select("/Houses/House/location[contains(../location, '" + location_input + "')]"); 

我已经尝试将lower-case()函数放在不同的位置,但它并不满意。

如何使../location的值作为小写进行比较?

注意:在我的c#代码中使用ToLower()将location_input设置为较低。

小写()函数仅从XPath 2.0开始支持。 如果您的环境支持此版本的标准,您可以编写:

 NodeIter = nav.Select("/Houses/House/location[contains(lower-case(.), '" + location_input + "')]"); 

但是,你很可能会遇到XPath 1.0。 在这种情况下,您可以滥用translate()函数:

 NodeIter = nav.Select("/Houses/House/location[contains(translate(., " + "'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '" + location_input + "')]"); 

translate(../location, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')如果你可以逃脱只是AZ

lower-case http://www.w3.org/TR/xpath-functions/#func-lower-case是XPath 2.0和XQuery 1.0的一部分,所以你需要使用XPath 2.0或XQuery 1.0实现,如XQSharp或类似如果要使用此类函数,请使用Saxon 9的.NET版本。

使用XPath 1.0,你所能做的就是NodeIter = nav.Select(string.Format("/Houses/House/location[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXZY', 'abcdefghijklmnopqrstuvwxyz'), '{0}')]", location_input));

请注意,严格来说,将两个字符串转换为较低(或较高)的情况并不是进行大小写比较的正确方法,因为Unicode中的小写字符到大写字符的映射不是一对一的。 原则上,在XPath 2.0中,您应该使用case-blind排序规则。 不幸的是,虽然许多XSLT 2.0和XQuery 1.0处理器允许你使用盲区整理,但是没有整理URI的标准,所以你的代码变得依赖于处理器。

只要您处理.net,就可以使用Microsoft扩展来进行不区分大小写的比较:ms:string-compare

https://msdn.microsoft.com/en-us/library/ms256114(v=vs.120).aspx

使用VS2017(NetFramework 4.6.1)并安装了XPath2 NuGet包,我遇到了同样的困境。 到目前为止,在使用XPath2函数时它对我来说很好。