2010-07-13 7 views
2

A partir de ce morceau de HTML:xPath: sélectionnez following-sibling et noeuds auto

<tbody> 
    <tr> 
    <tr id="1" class="first"> 
    <tr id="2" class=""> 
    <tr id="3" class="last"> 
    <tr id="4" class="first"> 
    <tr id="5" class=""> 
    <tr id="6" class="last"> 
<tbody> 

je essaie d'obtenir une expression XPath pour retourner tous les tr [@ class = 'premier'] nœuds suivi de tr qui n'a pas de "première" classe, y compris le premier noeud. Dans ce cas, un ensemble avec tr ids 1, 2, 3 et tr avec ids 4, 5, 6.

Ive a essayé d'utiliser:

//tbody/tr[@class='first']/self::* | following-sibling::tr[not(starts-with(@class, 'first'))] 

sans succès. Des pensées à ce sujet?

Merci

Répondre

0

Bien que ce n'est pas exactement ce que vous voulez, cette expression retournera tous les noeuds entre une première et dernière classe, mais il ne sera pas les regrouper. C'est le mieux que vous puissiez faire avec une seule expression XPath.

Compte tenu d'une entrée comme celui-ci,

<tbody> 
    <tr id="0" class=""/> 
    <tr id="1" class="first"/> 
    <tr id="2" class=""/> 
    <tr id="3" class="last"/> 
    <tr id="4" class="first"/> 
    <tr id="5" class=""/> 
    <tr id="6" class="last"/> 
    <tr id="7" class=""/> 
</tbody> 

Cette expression XPath,

/tbody/tr[ 
    (following-sibling::tr[@class='last'] and preceding-sibling::tr[@class='first']) 
    or @class='first' or @class='last' 
] 

Retournera ces nœuds:

<tr id="1" class="first" /> 
<tr id="2" class="" /> 
<tr id="3" class="last" /> 
<tr id="4" class="first" /> 
<tr id="5" class="" /> 
<tr id="6" class="last" /> 

L'expression fonctionne en vérifiant tous tr éléments dont précédent frère est une «première» et dont le frère ou la sœur suivant est un «dernier». De cette façon, il exclura tr s en dehors de ceux-ci.

Cependant, il ne fait aucun regroupement. Je ne connais aucun moyen de faire ce genre de regroupement avec une seule expression XPath. Si je devais le faire, j'aurais une expression XPath qui retournerait tous les 'premiers' tr s, puis marcherait à travers ses frères et sœurs jusqu'à ce que je trouve 'last' tr. Peut-être que quelqu'un d'autre connaît une meilleure façon de le faire.

+0

Merci, je vais essayer avec position() et du PHP – steaktartar

Questions connexes