XPATH — прекратить очистку после определенного элемента html

#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)]