Извлечение XQuery между двумя тегами - PullRequest
2 голосов
/ 25 июня 2010

В настоящее время я работаю над извлечением данных из HTML.Я хотел бы извлечь текст между двумя <p class="xfHeading"> тегами.

         <p class="xfHeading"><b>XYZ:</b></p> 
            <p>asdfghjk</p>  
            <p>sdsdsd</p>  
            <p>asdvcvcfghjk</p>  

         <p class="xfHeading"><b>ABC:</b></p> 
            <P>fvgbhnjm</P>  

         <p class="xfHeading"><b>PQR:</b></p> 
            <ul> 

            </ul> 

         <p class="xfHeading"><b>MNO:</b></p> 
             <ul> 
                <li>jdjshdj</li>  
             </ul> 

Выход должен быть:

asdfghjk

sdsdsd

asdvcvcfghjk

Один путь ксделать это:

/p[class="xfHeading"]/following-sibling::p[0]|/p[class="xfHeading"]/following-sibling::p[1]|/p[class="xfHeading"]/following-sibling::p[2]

или

/p[class="xfHeading"]/following-sibling::p[position()<4]

Однако, так как содержимое между постоянно меняется, мне нужно решение, в котором содержимое между двумя тегами <p class="xfHeading"> извлекается.

Ответы [ 2 ]

0 голосов
/ 26 июня 2010

Используйте

(//p[@class="xfHeading"])[1]
          /following-sibling::p
             [. << (//p[@class="xfHeading"])[2]]
                 /text()

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

0 голосов
/ 25 июня 2010

РЕДАКТИРОВАТЬ : После вашего разъяснения я предлагаю использовать выражение FLWOR , например, следующее.При этом выполняется поиск <p> с соответствующим содержимым тега <b>, основанным на уникальном содержимом этого тега <b>, и возвращается текст каждого тега <p>, который является родственным ему.

for $b in //p[class="xfHeading"]/b and $p in //p[class="xfHeading"]/p
    where $b/text() = "XYZ:"
        return p/text()

Обратите внимание, что // является конструкцией XPATH, а не комментарием

СТАРЫЙ ОТВЕТ : без примера того, как вы хотите, чтобы результирующие данные выглядели, отвечая навопрос немного сложныйОднако, чтобы выделить, например, текст внутри тега <b>, вы должны сделать:

/p[class = "xfHeading"]/b/text()

Как правило, добавление text() в конец выражения возвращает текст внутри узлапод вопросом.

...