2017-04-26 2 views
0

Ich habe die folgende HTML-Struktur:XPath, beginnen Sie mit (Text) und im Anschluss bis

<p><b> Some bold text which starts with xy <b> 
<p> text 
<p> text 
<p><b> Next bold text <b> 
<p> text 
<p> text 

Ich brauche einen XPath zu konstruieren, die den gesamten Text nach dem fett gedruckten Text erfasst, die mit xy beginnt nur bis zum nächsten fett Text, der nicht mit xy beginnt. Meine bisherigen Versuche:

"//p/*[starts-with(text()),'xy']/following::text()" 

Und doch greift diese alle Texte - auch, dass nach dem nächsten fett gedruckten Text, der mit xy nicht startet. Irgendwelche Vorschläge?

+0

Ich verstehe nicht ganz, was Sie bekommen möchten. Hoffe, es hilft dir: '// p [b [beginnt-mit (., 'Xy')]]/folgende :: * [vorhergehende :: p [b] [1]/b [beginnt-mit (., ' xy ')]]/text() ' – splash58

+0

@ splash58 Vielen Dank für Ihre Vorschläge, ich habe es versucht - noch, das Problem ist immer noch, dass auch dieser xpath alle Texte in p, einschließlich derjenigen nach dem nächsten fett p, die nicht mit beginnt xy. Was ich brauche, ist etwas, das nur den Text in p erfasst, der hinter jedem fettem p steht, das mit xy beginnt. – Sera

Antwort

0

Ich habe eine Lösung gefunden, die zu funktionieren scheint:

"//p/b[starts-with(.,'xy')]/following::p[count(preceding::b) = 1]" 

So ist der Trick der Zähler. Der Kompromiss besteht darin, dass durch Setzen des Zählers für alle vorhergehenden b bei 1 nicht weiter als der erste b nach dem b, der mit xy beginnt, sondern auch der Text in diesem b enthalten ist. Dies kann sicherlich verbessert werden, aber es ist jetzt für meine Zwecke in Ordnung.