XPath: выделение текста после определенного тега и до того же следующего тега - PullRequest
7 голосов
/ 21 июня 2011

У меня есть HTML-код, подобный этому:

<strong>Term:</strong>
Some text<br />
More text<br />
Some more lines of text
<strong>Term:</strong>
Some text<br />
More text<br />
Some more lines of text
<strong>Second term:</strong>
Some text<br />
More text<br />
Some more lines of text
<strong>Term:</strong>
Some text<br />
More text<br />
Some more lines of text

Мне нужно получить текстовые узлы между тегом с текстом «Term» и перед следующим тегом:

Some text
More text
Some more lines of text
Some text
More text
Some more lines of text
Some text
More text
Some more lines of text

Здесь может использоваться условие: предыдущий тег должен содержать текст «Term», но я не знаю, как создать селектор xpath, подобный этому.

Ответы [ 2 ]

5 голосов
/ 21 июня 2011
//text()[preceding::*[contains(text(),'Term:')] and following::*[contains(text(),'Term:')]]

Это то же самое, что предложил empo.Однако я ищу узел, содержащий термин и возвращающий все текстовые узлы, присутствующие между ними.

Однако, это работает нормально, только если у вас нет другого набора «термин».Дайте мне знать, если это так, потому что тогда этот Xpath будет возвращать также некоторые нежелательные значения.

С тех пор как вы обновили ввод.Я просто добавил еще одно условие к предыдущему Xpath.

//text()[preceding::*[contains(text(),'Term:')] and following::*[contains(text(),'Term:')] and not(contains(., 'Term:'))]

@ empo. Решение также работает.Но там мы принимаем во внимание <strong>.Написанный мною xpath просто проверяет слово 'Term:' и выдает все текстовые узлы между ними.

Дайте мне знать, если это работает для вас.

Привет.

2 голосов
/ 21 июня 2011

Ваш вопрос по-прежнему неоднозначен, а входной документ плохо сформирован.Проверьте это:

root/text()[preceding::strong[1][contains(text(),'Term')]]

Применено:

<root>
<strong>Term:</strong>
Some text<br />
More text<br />
Some more lines of text
<strong>Term:</strong>
Some text2<br />
More text2<br />
Some more lines of text2
<strong>Second term:</strong>
Some text3<br />
More text3<br />
Some more lines of text3
<strong>Term:</strong>
Some text4<br />
More text4<br />
Some more lines of text4
</root>

производит:

Some text
More text
Some more lines of text

Some text2
More text2
Some more lines of text2

Some text4
More text4
Some more lines of text4

Этот XPath выбирает все текстовые узлы между элементом, содержащимстрока Term: и элемент, содержащий любую строку:

//text()[preceding::*[contains(text(),'Term:')] and following::*[text()]]

Применено:

<root>
<strong>Term:</strong>
Some text<br />
More text<br />
Some more lines of text
<strong>Second term:</strong>
Some text2<br />
More text2<br />
Some more lines of text2
</root>

Возвращает:

Some text
More text
Some more lines of text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...