XPath小写()函数

时间:2012-01-23 18:19:46

标签: c# xml xpath selector

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

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

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

我现在已经把它作为我的选择器了:

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

我已尝试将lower-case()功能放在不同的位置,但对此并不满意。

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

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

6 个答案:

答案 0 :(得分:17)

仅从XPath 2.0开始支持lower-case()功能。如果您的环境支持此版本的标准,您可以写:

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 + "')]");

答案 1 :(得分:4)

translate(../location, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')如果你可以逃脱A-Z

答案 2 :(得分:2)

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)或类似.NET版本的Saxon 9(如果您想使用此类功能

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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