XPath: как делать поиск текста без учета регистра в JS

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Безусловно, поиск без учета регистра в XPath возможен. Для этого использование функции translate() будет оптимальным решением:

xml
Скопировать код
//*[translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') 
  contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'термин')]

Вместо 'термин' укажите ваш поисковый запрос в нижнем регистре. Такой подход позволит вам применять функцию contains() без учета регистра.

Кинга Идем в IT: пошаговый план для смены профессии

Детальное рассмотрение функции translate()

Функция translate() предоставляет возможность настроить работу с текстом в XPath 1.0, конвертируя буквы из одного набора символов в другой, благодаря чему сможете игнорировать регистр при поиске.

xml
Скопировать код
// Отношение к символам: узнавание без учета регистра
translate(., 'ABCDE...Z', 'abcde...z')

Такая методика приближает нас к восприятию XPath как к системе, не основывающейся на регистре символов.

Возможные ограничения и альтернативные варианты решения

Хотя translate() достаточно универсальна, она имеет свои ограничения при работе со специальными символами и одинарными кавычками. В таких ситуациях придется ссылаться на escape-последовательности, что усложнит выражения.

В XPath 2.0 представлены новые функции, например, lower-case() и matches(), которые делают работу с текстом в разных регистрах более удобной. Функция matches() предоставляет возможность использовать регулярные выражения и реализовать поиск без учета регистра с флагом 'i'.

Использование JavaScript для построения динамических выражений XPath

Если вы работаете с DOM в Javascript, создание динамических выражений XPath может быть крайне полезным. Для этого потребуется глубокое понимание как XPath, так и JavaScript.

JS
Скопировать код
// Попробуем используя JavaScript
let dynamicXPath = (term) => `//*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '${term}')`;

Практические примеры и потенциальные трудности

Чтобы применять поиск без учета регистра во всех возможных сценариях, используйте следующий подход:

xml
Скопировать код
//*[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'пример')]

Вместо 'пример' подставьте ваш поисковый запрос. Обратите внимание: использование ДИНОЗАВРОВ независимо от их регистра недопустимо.

Визуализация

Сравните функцию contains() в XPath с садовыми перчатками, которые надеваются во время работы в саду:

Markdown
Скопировать код
Эткитека перчаток гласит: "Подходят рукам всех размеров"

Вот как работает стандартный contains() (с учетом регистра):

Markdown
Скопировать код
🖐️ Примерка: "Большой" (🧤), "большой" (🧦), "БОЛЬШОЙ" (🧣)
✅ Подходят: "Большой" (🧤)
❌ Не подходят: "большой" (🧦), "БОЛЬШОЙ" (🧣)

А вот применим contains() с функцией translate() (без учета регистра):

Markdown
Скопировать код
🖐️ Примерка: "Большой" (🧤), "большой" (🧦), "БОЛЬШОЙ" (🧣)
✅ Подходят: "Большой" (🧤), "большой" (🧦), "БОЛЬШОЙ" (🧣)

Функция translate() делает садовые перчатки более универсальными и допускает любые вариации написания текста.

Полезные материалы

  1. Язык пути в XML (XPath)основная спецификация по функциям XPath.
  2. Справочник функций XPath, XQuery и XSLTдетальное описание и примеры работы с функциями XPath.
  3. translate – XPath | MDN — учебный материал по использованию функции translate() в XPath.
  4. Условное выполнение — статья, демонстрирующая контекст поиска без учета регистра с помощью функций XPath.
  5. Документация IBM — раздел, обсужающий функциональность XPath и XSLT для поиска без учета регистра.
  6. Что означает это предупреждение Lint для Android: "Неправильная ориентация?" — хотя тематика и отличается, разговор идет о полезных подходах к решению технических задач.