XPath小写()函数

问题描述 投票:5回答:6

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

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

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

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

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

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

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

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

c# xml xpath selector
6个回答
17
投票

lower-case()函数仅从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 + "')]");

4
投票

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


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));


2
投票

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


0
投票

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.