Проблема соответствия XPath, когда текст содержит вместо обычного пробела - PullRequest
4 голосов
/ 26 февраля 2020

Для обычного HTML

<b>WordA WordB WordC</b>

Я бы использовал этот XPath для извлечения этого элемента.

//b[text()='WordA WordB WordC']

Но у меня ниже HTML

<b>WordA&nbsp;WordB&nbsp;WordC</b>

Когда я пытаюсь получить элемент в этом случае, первый XPath ничего не возвращает.

//b[text()='WordA\u00a0WordB\u00a0WordC']

Над одним работает.

Но вместо использования '\ u00a0' часть, есть лучший способ справиться с этой ситуацией. Некоторая определенная функция для нормализации пробелов.

et c:

//b[someFunction()='WordA WordB WordC']

Ответы [ 2 ]

6 голосов
/ 26 февраля 2020

Обратите внимание, что \u00a0 работает, потому что ваше выражение XPath встроено в некоторый хост-язык (например, Java или Javascript), который распознает escape-последовательность uNNNN - это преобразуется в символ NBSP с помощью содержащего язык хоста, а не сам XPath. Если бы XPath был встроен в XML (например, в XSLT или XSD), вы бы использовали &#xa0; вместо \u00a0.

Нет специального способа обработки NBSP в XPath, но вы могли бы перевести эти символы для регулярных пробелов с помощью translate ():

//b[translate(text(), '\u00a0', ' ') = 'WordA WordB WordC']

Обратите также внимание, что в таких выражениях обычно лучше использовать . вместо text() для доступа к строковому значению элемента. Это более устойчиво к вариациям, которые могут возникнуть, например, одно из слов, выделенных курсивом, или слова, разделенные комментариями.

0 голосов
/ 26 февраля 2020

Я бы не использовал символы &nbsp;, что значительно упростит задачу:

//b[contains(., 'WordA') and contains(., 'WordB') and contains(., 'WordC')]

Точно:

//b[starts-with(., 'WordA') and contains(., 'WordB') and contains(., 'WordC')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...