#xpath
#xpath
Вопрос:
Я использую этот запрос XPATH, чтобы попытаться получить первые три элемента из «Цены пакета ASQ»:
//h2[contains(., 'ASQ Package Features')]/following-sibling::p
Но он также захватывает другие 3 элемента, поэтому я в итоге получаю
Пример 1 Пример 2 Пример 3 Пример 4 Пример 5 Пример 6
Я только хочу:
Пример 1 Пример 2 Пример 3
Как мне запретить XPATH очищать три, которые мне не нужны — кажется, в этом случае он должен остановиться на <hr>
теге?
<div itemprop="articleBody">
<h2>ASQ Package Price</h2>
<p class="">Example 1</p>
<p class="">Example 2</p>
<p class="">Example 3</p>
<hr>
<h2>ASQ Package Featuresamp;nbsp;</h2>
<p class="">Example 4</p>
<p class="">Example 5</p>
<p class="">Example 6</p>
</div>
Ответ №1:
Используйте:
(//h2[starts-with(., 'ASQ Package')])[1]/following-sibling::hr[1]
/preceding-sibling::p
Проверка с помощью XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"(//h2[starts-with(., 'ASQ Package')])[1]
/following-sibling::hr[1]
/preceding-sibling::p"/>"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование выполняется на предоставленном Html (настроенном на синтаксически корректный XHtml):
<html>
<div itemprop="articleBody">
<h2>ASQ Package Price</h2>
<p class="">Example 1</p>
<p class="">Example 2</p>
<p class="">Example 3</p>
<hr />
<h2>ASQ Package Featuresamp;#160;</h2>
<p class="">Example 4</p>
<p class="">Example 5</p>
<p class="">Example 6</p>
</div>
</html>
вычисляется выражение XPath, и выводятся все выбранные им узлы:
<p class="">Example 1</p>
<p class="">Example 2</p>
<p class="">Example 3</p>
Объяснение:
Нам нужны <p>
только элементы, относящиеся к предыдущему типу, первого <hr>
следующего за первым <h2>
в документе, строковое значение которого начинается с "ASQ Package"
, и
Первый такой <h2>
элемент выбирается этим выражением XPath:
(//h2[starts-with(., 'ASQ Package Features')])[1]
Затем мы выбираем его первый следующий брат <hr>
:
(//h2[starts-with(., 'ASQ Package Features')])[1]/following-sibling::hr[1]
Затем мы выбираем все его элементы, относящиеся к предыдущему типу <p>
:
(//h2[starts-with(., 'ASQ Package')])[1]/following-sibling::hr[1]
/preceding-sibling::p
Ответ №2:
Использование xpath 2.0:
//h2/following-sibling::p intersect //hr/preceding-sibling::p
Использование xpath 1.0:
//h2/following-sibling::p[not(preceding-sibling::hr)]