XPath "folgenden Geschwistern vor"

html-agility-pack xpath

Frage

Ich versuche Elemente (a) mit XPath 1.0 (oder möglicherweise mit Regex) auszuwählen, die Geschwister eines bestimmten Elements (b) folgen, aber nur einem anderen b-Element vorausgehen.

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

Ich habe versucht, die Probe so realitätsnah wie möglich zu gestalten. Also in diesem Szenario, wenn ich bei Element bin

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

Ich muss auswählen

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

und wenn ich bei bin

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

Ich muss auswählen

<img><b>First</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br>
<img><b>Second</b><br>&nbsp;&nbsp;
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br>
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br>

Irgendeine Idee, wie man das erreicht? Vielen Dank!

Akzeptierte Antwort

Erstelle diesen XPath dynamisch:

following-sibling::a[preceding-sibling::b[1][.='xxxx']]

wobei 'xxxx' durch den Text des aktuellen <b> .

Das setzt voraus , dass alle Elemente sind tatsächlich Geschwister. Wenn dies nicht der Fall ist, können Sie versuchen, mit der preceding und der following Achse zu arbeiten, oder Sie schreiben einen spezifischeren XPath, der der Struktur des Dokuments besser ähnelt.

In XSLT können Sie auch verwenden:

following-sibling::a[preceding-sibling::b[1][.='xxxx']]

Beliebte Antwort

Hier ist eine Lösung, die nur ein einziger XPath-Ausdruck ist .

Verwenden der Kaysian-Formel für den Schnittpunkt zweier Knotensätze $ns1 und $ns2 :

  $ns1[count(. | $ns2) = count($ns2)]

Wir ersetzen einfach $ns1 durch den Knotensatz von <a> Geschwistern, die dem aktuellen <b> -Knoten folgen, und wir ersetzen $ns2 durch den Knotensatz von <a> Geschwistern, die dem nächsten <b> Knoten vorausgehen.

Hier ist eine vollständige Transformation, die dies verwendet :

  $ns1[count(. | $ns2) = count($ns2)]

Wenn diese Transformation auf das folgende XML-Dokument angewendet wird :

  $ns1[count(. | $ns2) = count($ns2)]

Das korrekte Ergebnis wird erzeugt :

  $ns1[count(. | $ns2) = count($ns2)]



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum