Xpath: найти данные, не содержащиеся в тегах - PullRequest
1 голос
/ 07 февраля 2011

Я пытаюсь настроить таргетинг данных, которые не находятся вне тега (кроме всех охватывающих p)

<p>
    <strong>id1:</strong>data1<br />
    data2<br />
    <strong>id3:</strong>data3<br />
    <strong>id4:</strong>data4
</p>
<p>
    <strong>id1:</strong>data1<br />
    data2<br />
    <strong>id3:</strong>data3
</p>

Любые предложения, как я могу получить данные1, данные2 и данные3 и иметь возможность идентифицировать их уникальным образом (например, данные3 следуют за strong[.='id3:'] и заканчиваются до <br/>)

РЕДАКТИРОВАТЬ: data2 всегда следует за data1 после <br/> Спасибо

Ответы [ 3 ]

3 голосов
/ 07 февраля 2011

Чтобы найти текстовый узел, который следует сразу за <strong>id1</strong>, используйте strong[.='id1']/following-sibling::text()[1] (с элементом p в качестве узла контекста).

Это предполагает, что вы знаете, что будет такой текстовый узел.Более строгим тестом является strong[.='id1']/following-sibling::node()[1][self::text()], который найдет первый узел (любого типа) после сильного элемента и вернет его при условии, что он окажется текстовым узлом.

Непонятно, как вы хотитеопределить data2 в вашем примере.

2 голосов
/ 07 февраля 2011

Просто используйте :

p/text()

, чтобы выбрать все текстовые узлы, которые являются дочерними элементами p элементов, которые являются дочерними элементами текущего узла.* Или, если вы хотите исключить текстовые узлы только для пробелов, используйте :

p/text()[normalize-space()]

Если вы хотите выбрать n-й такой текстовый узел, используйте :

p/text()[normalize-space()][1]
p/text()[normalize-space()][2]

.,,,,,,,,.

до

p/text()[normalize-space()][$k]

, где $k - общее количество таких узлов:

count(p/text()[normalize-space()])
0 голосов
/ 07 февраля 2011

Его можно извлечь с помощью text ().

для примера, приведенный ниже xpath дает вам требуемый результат

// p / text ()

...