Это для XPath 1.0. Если ваша среда поддерживает XPath 2.0, см. Здесь .
Да. Можно, но не красиво.
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
Это будет работать для строк поиска, в которых заранее известен алфавит. Добавьте любые символы с диакритическими знаками, которые вы ожидаете увидеть.
Если можете, отметьте интересующий вас текст другими способами, например, заключите его в объект <span>
, имеющий определенный класс, при построении HTML. Такие вещи намного проще найти с помощью XPath, чем подстроки в тексте элемента.
Если это не вариант, вы можете позволить JavaScript (или любому другому хост-языку, который вы используете для выполнения XPath) помочь вам в создании динамического выражения XPath:
function xpathPrepare(xpath, searchString) {
return xpath.replace("$u", searchString.toUpperCase())
.replace("$l", searchString.toLowerCase())
.replace("$s", searchString.toLowerCase());
}
xp = xpathPrepare("//text()[contains(translate(., '$u', '$l'), '$s')]", "Test");
(Подсказка к ответу @KirillPolishchuk - конечно, вам нужно перевести только те символы, которые вы действительно ищете .)
Такой подход будет работать для любой поисковой строки без предварительного знания алфавита, что является большим плюсом.
Оба приведенных выше метода не работают, если строки поиска могут содержать одинарные кавычки, и в этом случае все становится сложнее .
translate()
Сама по себе не волнует, как часто вы повторяете каждый символ -translate(., 'EE', 'ee')
абсолютно эквивалентноtranslate(., 'E', 'e')
. PS: Не забудьте проголосовать за @KirillPolishchuk, идея была его.Более красивый:
/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
источник
TEST
вtest
и оставитьTest
как есть?translate(., 'TES', 'tes')
. Так люди поймут, что это не перевод слова, а буквальный.Решения XPath 2.0
Используйте строчные буквы () :
/html/body//text()[contains(lower-case(.),'test')]
Используйте сопоставление регулярного выражения match () с его флагом без учета регистра:
/html/body//text()[matches(.,'test', 'i')]
источник
Да. Вы можете использовать
translate
для преобразования текста, который хотите сопоставить, в нижний регистр следующим образом:/html/body//text()[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'test')]
источник
Если вы используете XPath 2.0, вы можете указать сопоставление в качестве третьего аргумента для contains (). Однако URI параметров сортировки не стандартизированы, поэтому детали зависят от продукта, который вы используете.
Обратите внимание, что все решения, приведенные ранее с использованием translate (), предполагают, что вы используете только 26-буквенный английский алфавит.
ОБНОВЛЕНИЕ: XPath 3.1 определяет стандартный URI сортировки для сопоставления без учета регистра.
источник
Я всегда делал это с помощью функции "translate" в XPath. Не скажу, очень красиво, но работает корректно.
/html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')]
надеюсь это поможет,
источник