XPath: как делать поиск текста без учета регистра в JS
Быстрый ответ
Безусловно, поиск без учета регистра в XPath возможен. Для этого использование функции translate() будет оптимальным решением:
//*[translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')
contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'термин')]
Вместо 'термин'
укажите ваш поисковый запрос в нижнем регистре. Такой подход позволит вам применять функцию contains()
без учета регистра.
Детальное рассмотрение функции translate()
Функция translate() предоставляет возможность настроить работу с текстом в XPath 1.0, конвертируя буквы из одного набора символов в другой, благодаря чему сможете игнорировать регистр при поиске.
// Отношение к символам: узнавание без учета регистра
translate(., 'ABCDE...Z', 'abcde...z')
Такая методика приближает нас к восприятию XPath как к системе, не основывающейся на регистре символов.
Возможные ограничения и альтернативные варианты решения
Хотя translate()
достаточно универсальна, она имеет свои ограничения при работе со специальными символами и одинарными кавычками. В таких ситуациях придется ссылаться на escape-последовательности, что усложнит выражения.
В XPath 2.0 представлены новые функции, например, lower-case() и matches(), которые делают работу с текстом в разных регистрах более удобной. Функция matches()
предоставляет возможность использовать регулярные выражения и реализовать поиск без учета регистра с флагом 'i'
.
Использование JavaScript для построения динамических выражений XPath
Если вы работаете с DOM в Javascript, создание динамических выражений XPath может быть крайне полезным. Для этого потребуется глубокое понимание как XPath, так и JavaScript.
// Попробуем используя JavaScript
let dynamicXPath = (term) => `//*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '${term}')`;
Практические примеры и потенциальные трудности
Чтобы применять поиск без учета регистра во всех возможных сценариях, используйте следующий подход:
//*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'пример')]
Вместо 'пример'
подставьте ваш поисковый запрос. Обратите внимание: использование ДИНОЗАВРОВ независимо от их регистра недопустимо.
Визуализация
Сравните функцию contains()
в XPath с садовыми перчатками, которые надеваются во время работы в саду:
Эткитека перчаток гласит: "Подходят рукам всех размеров"
Вот как работает стандартный contains()
(с учетом регистра):
🖐️ Примерка: "Большой" (🧤), "большой" (🧦), "БОЛЬШОЙ" (🧣)
✅ Подходят: "Большой" (🧤)
❌ Не подходят: "большой" (🧦), "БОЛЬШОЙ" (🧣)
А вот применим contains()
с функцией translate()
(без учета регистра):
🖐️ Примерка: "Большой" (🧤), "большой" (🧦), "БОЛЬШОЙ" (🧣)
✅ Подходят: "Большой" (🧤), "большой" (🧦), "БОЛЬШОЙ" (🧣)
Функция translate()
делает садовые перчатки более универсальными и допускает любые вариации написания текста.
Полезные материалы
- Язык пути в XML (XPath) — основная спецификация по функциям XPath.
- Справочник функций XPath, XQuery и XSLT — детальное описание и примеры работы с функциями XPath.
- translate – XPath | MDN — учебный материал по использованию функции translate() в XPath.
- Условное выполнение — статья, демонстрирующая контекст поиска без учета регистра с помощью функций XPath.
- Документация IBM — раздел, обсужающий функциональность XPath и XSLT для поиска без учета регистра.
- Что означает это предупреждение Lint для Android: "Неправильная ориентация?" — хотя тематика и отличается, разговор идет о полезных подходах к решению технических задач.