XPath "suivre la fratrie avant"

html-agility-pack xpath

Question

J'essaie de sélectionner des éléments (a) avec XPath 1.0 (ou éventuellement avec Regex) qui suivent les frères et soeurs d'un élément particulier (b) mais précèdent un autre élément b.

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

J'ai essayé de rendre l'échantillon le plus proche possible du monde réel. Donc, dans ce scénario quand je suis à l'élément

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

J'ai besoin de choisir

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

et quand je suis à

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

J'ai besoin de choisir

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

Une idée comment y parvenir? Je vous remercie!

Réponse acceptée

Créer dynamiquement ce XPath:

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

où 'xxxx' est remplacé par le texte du <b> actuel.

Cela suppose que tous les éléments sont réellement des frères et soeurs. S'ils ne le sont pas, vous pouvez essayer de travailler avec les axes preceding et following , ou vous écrivez un XPath plus spécifique qui ressemble davantage à la structure du document.

Dans XSLT, vous pouvez également utiliser:

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

Réponse populaire

Voici une solution qui n’est qu’une expression XPath unique .

Utilisation de la formule de Kaysian pour l'intersection de deux ensembles $ns1 et $ns2 :

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

Nous substituons simplement $ns1 avec le groupe de noeuds de <a> frères qui suivent le noeud <b> actuel et nous substituons $ns2 avec le groupe de noeuds de <a> frères qui précèdent le prochain noeud <b> .

Voici une transformation complète qui utilise ceci :

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

Lorsque cette transformation est appliquée sur le document XML suivant :

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

le résultat correct est produit :

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi