Как выполнить поиск без учета регистра в XPath?

Я пытаюсь реализовать поиск без учета регистра, используя XPath. Я уже упоминал, как выполнить селектор атрибутов без учета регистра в 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"

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.

XPath 2.0

Если вы используете регистронезависимые совпадения (),

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

вам не нужно беспокоиться о случае вашего search переменная.


См. Также регистр не чувствительный xpath содержит () возможно? для других решений XPath 1.0 и 2.0.

Другие вопросы по тегам