Заставить XPath остановиться на определенной глубине?

#xpath

#xpath

Вопрос:

У меня есть следующий HTML

 <span class="medium bold day-time-clock">
            09:00
            <div class="tooltip-box first-free-tip ">
                <div class="tooltip-box-inner">
                    <span class="fa fa-clock-o"></span>
                    Some more text
                </div>
            </div>
        </span>
  

Я хочу XPath, который получает только текст 09:00, а не еще какой-то текст, который НЕ используется text()[1] , потому что это вызывает другие проблемы. Мой текущий XPath выглядит следующим образом

 ("//span[1][contains(@class, 'day-time-clock')]/text()")
  

Я хочу тот, который игнорирует всю эту часть HTML

     <div class="tooltip-box first-free-tip ">
        <div class="tooltip-box-inner">
            <span class="fa fa-clock-o"></span>
            Some more text
        </div>
    </div>
  

Комментарии:

1. //span[1][contains(@class, 'day-time-clock')]/text() не будет соответствовать Some more text ! Обратите внимание, что /text() может быть выбран дочерний текстовый узел только тогда, когда он "Some more text" являетсятекстовым узлом-потомком… Можете ли вы поделиться немного более подробной информацией, поскольку на данный момент ваша проблема совершенно неясна?

Ответ №1:

Вы можете ограничить уровень descendant:: узлов с помощью position() .
Итак, следующее выражение действительно работает:

 span/descendant::node()[2 > position()]
  

Отрегулируйте число в предикате в соответствии с вашими потребностями, 2 это только пример. Недостатком этого подхода является то, что подсчет потомков точен только для первого дочернего элемента в нисходящем дереве.


Другой подход ограничивает оба: предков и потомков:

 span/descendant::node()[3 > count(ancestor::*) and 1 > count(descendant::*)]
  

Здесь также вам нужно настроить числа в предикатах, чтобы получить какие-либо полезные результаты.

Ответ №2:

Используйте normalize-space() для выбора всех узлов документа, не содержащих пробелов:

//span[contains(@class, 'day-time-clock')]/text()[normalize-space()]

Комментарии:

1. Но во втором узле есть содержимое, то есть это не узел с пробелами. Я не понимаю вашего ответа?

2. Каждый дочерний тег в текстовом узле родительского тега является разделителем для текстового узла родительского тега, при этом содержимое вложенных тегов игнорируется. Соответственно, количество текстовых узлов в теге равно n 1 , где n» — количество тегов с первого уровня вложенности. В текущем случае имеется только один непустой текстовый узел.

Ответ №3:

Я думаю (если я вас правильно понимаю), что

 "..//div[contains(@class, 'tooltip-box')]/parent::span"
  

вы попадаете туда.