2011-06-21 6 views
6

mam kod HTML tak:XPath: wybierz tekst po pewnym tagu i przed samym następnego tagu

<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 

Muszę węzły tekstowe pomiędzy znacznikiem z tekstem „termin”, a przed następnym tagu:

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 

Tu można zastosować warunek: poprzedni znacznik musi zawierać tekst "Term", ale nie wiem jak utworzyć selektor xpath w ten sposób.

+1

Witam, wydaje mi się, że pytanie nie jest zbyt jasne. Czy możesz podać, jakie jest pożądane wyjście. Może wtedy mogę zrozumieć, czego dokładnie chcesz. – Ravish

+0

Uaktualniłem pytanie. Przepraszam za mój zły angielski. –

+0

Zmieniono dane wejściowe, zaktualizuj również żądane dane wyjściowe. Ponadto dodaj znaczący tekst do rozróżnienia wśród dzieci. Według twojego opisu nadal trudno jest zrozumieć, czego potrzebujesz. –

Odpowiedz

2

Twoje pytanie jest nadal niejednoznaczne, a twój dokument wejściowy nie jest dobrze sformułowany. Sprawdź to:

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

nakładać na:

<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> 

produkuje:

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 

ten XPath, wybiera wszystkie węzły tekstowe pomiędzy elementem zawierające ciąg Term: i element zawierający dowolny ciąg:

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

nakładać na:

<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> 

Powroty:

Some text 
More text 
Some more lines of text 
4
//text()[preceding::*[contains(text(),'Term:')] and following::*[contains(text(),'Term:')]] 

To samo, co Empo zasugerował. Jednak szukam węzła zawierającego Term i zwraca wszystkie węzły tekstowe obecne między nimi.

Jednak działa to dobrze tylko, jeśli nie masz innego zestawu "Term". Daj mi znać, jeśli tak jest, ponieważ wtedy ta Xpath zwróci również niechciane wartości.

Od tego czasu zaktualizowałeś dane wejściowe. Po prostu umieściłem jeszcze jeden warunek do poprzedniej Xpath.

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

Rozwiązanie @empo również działa. Ale uwzględniamy <strong>. Ścieżka xpath, którą napisałem, po prostu sprawdza słowo "Termin:" i podaje wszystkie textNodes między nimi.

Daj mi znać, jeśli to działa dla Ciebie.

Pozdrawiam.

+0

Twoje rozwiązanie działa znakomicie, ale zwraca tylko jeden mecz. Co zrobić, jeśli muszę pobrać cały tekst po wszystkich tagach z tekstem "Term"? –

+0

@Stephan powinieneś pokazać nam znacznie więcej twojego dokumentu wejściowego. –

+0

Przykład zaktualizowany. –