【问题标题】:XPath lower-case() functionXPath 小写() 函数
【发布时间】:2012-01-23 18:19:46
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • “不满意”是什么意思?

标签: c# xml xpath selector


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    translate(../location, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') 如果你只用 A-Z 就可以了

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          只要你在处理.net,你可以使用微软扩展来做一个不区分大小写的比较:ms:string-compare

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-30
              • 1970-01-01
              • 2012-03-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多