Как выполнить поиск без учета регистра в 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.