【问题标题】:How to perform case insensitive search in XPath?如何在 XPath 中执行不区分大小写的搜索?
【发布时间】:2016-07-24 05:59:15
【问题描述】:

我正在尝试使用 XPath 实现不区分大小写的搜索。 我已经提到了how to perform a case-insensitive attribute selector in xquery,所以请在标记为重复之前检查。我正在使用 Lcase 将我的变量 (L_search) 转换为小写和小写函数。

我原来区分大小写的 XPath 表达式是:

XPath       =  "//*[contains(., '"& search &"')]/ancestor-or-self::*/*[local-name()='home' and @locale='en']"

我尝试了很多组合,例如:

XPath       =  "//*lower-case([contains(., '"& L_search &"')])/ancestor-or-self::*/*[local-name()='home' and @locale='en']"

XPath       =  "//*[contains(lower-case(.), '"& L_search &"')])/ancestor-or-self::*/*[local-name()='home' and @locale='en']"

但它们都没有产生结果。

这是我正在运行的代码:

Sub ProcessFolder(FolderPath)
    On Error Resume Next
    Set fldr = fso.GetFolder(FolderPath)

    Set Fls = fldr.files
    For Each thing in Fls
            sFSpec = FSO.GetAbsolutePathName(thing)
            objMSXML.async = True
            objMSXML.load sFSpec
             If 0 = objMSXML.parseError Then
                Dim sXPath   : sXPath       =  "//*[contains(., '"& search &"')]/ancestor-or-self::*/*[local-name()='name' and @locale='en']"

                Dim querySubject : Set querySubject = objMSXML.selectSingleNode(sXPath)
                    Set p = document.createElement("p")
                        p.innerText = thing.Path
                        document.body.appendChild p
                    If querySubject Is Nothing Then
                        MsgBox sXPath, "failed"

【问题讨论】:

  • 按原样,您的问题很难回答。您使用的是什么 XQuery 实现,它是否支持 XQuery 3.0?您是否真的使用 XQuery,因为您正在调用字符串“XPath”,这只是一个子集?请通常提供可重现的示例,其中包括输入和预期输出。我投票结束您的问题,因为您的问题不完整,请使用所需的详细信息对其进行编辑(这将停止关闭过程)。
  • 根据您的问题标题,我已经shown you how to do case-insensitive matching。如果您需要进一步的帮助,请阅读How to Ask,在您说此xpath 代码对我工作正常 处解释您的评论(所以您的问题得到了回答?),如果您仍有问题,创建一个minimal reproducible example。谢谢。
  • 您发布的代码看起来像使用 MSXML 的 VBScript,它只支持 XPath 1.0,但肯定不支持 XQuery 版本。
  • 这个问题现在看起来好多了,而且您添加了非常相关的信息。请注意,您没有对 XQuery 的任何支持,并且坚持使用非常简单的 XPath 1.0。已经作为答案提供的translate(...) 解决方案对您来说是唯一可能的,尽管它不是很优雅。 XQuery 是 XPath 的一个更强大的超集,但几乎没有直接的语言支持,并且需要嵌入或连接一些提供 XQuery 集成的库。
  • 在仔细研究了这里真正要问的问题之后,如何做到不区分大小写 contains() 实际上只是 case insensitive xpath contains() possible? 的复制品

标签: xml xpath vbscript msxml


【解决方案1】:

XPath 2.0

如果你使用不区分大小写的matches()

"//*[matches(., '"& search &"', 'i')]/ancestor-or-self::*/*[local-name()='home' and @locale='en']"

您无需担心search 变量的大小写。


有关其他 XPath 1.0 和 2.0 解决方案,另请参阅 case insensitive xpath contains() possible?

【讨论】:

  • 不要告诉我们有什么问题。告诉我们你做了什么以及它是如何失败的。
  • @KailashSingh:这涵盖了您所做的部分——不包括 XML,因此我们可以重现——但它没有涵盖它是如何失败的。更糟糕的是,您在问题中添加的评论指出 此 xpath 代码对我来说工作正常,让我们想知道您的问题还存在什么问题。
  • 那条评论是为了@jens Erat 工作正常意味着我不关心 3.0 或其他任何东西.....即使它不符合他对 3.0 的定义,它也会给出结果。现在我试图让我的搜索不区分大小写.....
【解决方案2】:

VBScript 仅支持 XPath 1.0,不支持 XQuery,因此请先编辑您的问题标题。

在 XPath 1.0 中,translate() 函数用于不区分大小写。

//*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') , search)]/ancestor-or-self::*/*[local-name()='home' and @locale='en']

其中搜索 = Lcase(V_SAEARCH)

它将完美运行。无需在变量周围使用引号。

另一种写法是:-

//*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') , translate('" & search & "', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]/ancestor-or-self::*/*[local-name()='home' and @locale='en']

这里的搜索变量正在 XPath 中翻译。

【讨论】:

  • 谢谢,我是初学者,所以不知道有版本和所有......非常感谢它完美地工作。
  • 如果search 被解释为一个变量名,XPath 不是必须通过字符串连接来构造,这样search 在XPath 中就不会被解释为一个元素名吗?跨度>
  • 不需要字符串连接到“搜索”,它只需要在 contains() 中.....它给出了正确的结果。
  • 仍在 contains() 中,但不需要连接。
  • @KailashSingh:search 是 XPath 外部的变量还是 XML 中的元素名称?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2013-02-24
  • 2018-09-29
相关资源
最近更新 更多