XPath select item and next item

I have a large data table roughly outlined as follows. In accordance with the requirements below is a complete sample, not a simplification.

<table class="grid resultRaceGrid" id="mainGrid">
<tr>
    <th width="10">&nbsp;</th>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
    <th>HORSE/SP</th>
    <th>AGE</th>
    <th>WGT</th>
    <th>TRAINER/JOCKEY</th>
    <th>OR</th>
    <th>TS</th>
    <th>RPR</th>
    <th width="10">&nbsp;</th>
</tr>
<tr>
    <td colspan="11" class="separator">&nbsp;</td>
</tr>
<tr>
    <td rowspan="2" class="last"><a href="/horses/result_home.sd?race_id=443557&amp;r_date=2007-11-21&amp;popup=yes" class="bull"><b>&laquo;</b></a></td>
    <td rowspan="2" class="nowrap noPad"><h3>1 </h3></td>
    <td rowspan="2" class="dstDesc"></td>
    <td class="nowrap"><span class="black"><a href="#" id="noteIcon_673823" class="pencil" onclick="return false;"><!-- --></a><b><a href="/horses/horse_home.sd?horse_id=673823" onclick="return popup(this, {width:695, height:800})" title="Full details about this HORSE">Andytown</a></b> (IRE) 6/4F <img src="http://ui.racingpost.com/ico/tipping-success.gif" class="shilda" title="Tipped by Topspeed" alt="" /></span></td>
    <td class="black">5</td>
    <td class="nowrap black"><span>11-1&nbsp;<span class="lightGray"></span></span></td>
    <td class="nowrap black"><a href="/horses/trainer_home.sd?trainer_id=13176" onclick="return popup(this, {width:695, height:800})" title="Full details about this TRAINER">N G Richards</a></td>
    <td rowspan="2" class="lightGray">&mdash;</td>
    <td rowspan="2" class="lightGray"><span class="red bold">*</span></td>
    <td rowspan="2" class="last"><span class="red bold">*</span></td>
    <td rowspan="2" class="last"><a href="/horses/result_home.sd?race_id=450083&amp;r_date=2008-03-08&amp;popup=yes" class="bull"><b>&raquo;</b></a></td>
</tr>
<tr>
    <td colspan="3"><span class="pedigrees">ch g <a href="/bloodstock/stallionbook/stallion_home.sd?horse_id=42337&amp;popup=1" onclick="return popup(this, {width:734, height:800})" title="Full details about this STALLION">Old Vic</a> - <a href="/bloodstock/dam_home.sd?horse_id=519458" onclick="return popup(this, {width:695, height:800})" title="Full details about this DAM ">Pitfire (IRE)</a> (<a href="/bloodstock/stallionbook/stallion_home.sd?horse_id=303796&amp;popup=1" onclick="return popup(this, {width:734, height:800})" title="Full details about this STALLION">Parliament</a>)</span></td>
    <td class="lightGray"><a href="/horses/jockey_home.sd?jockey_id=82320" onclick="return popup(this, {width:695, height:800})" title="Full details about this JOCKEY">Fearghal Davis</a><sup>5</sup></td>
</tr>
<tr class="rowComment hideComment">
    <td colspan="3">&nbsp;</td>
    <td colspan="7"><div class="commentText">   Went prominent 6th, challenged 2 out, soon ridden, narrow advantage last, forged clear towards finish (tchd 7-4)</div></td>
    <td>&nbsp;</td>
</tr>
<tr>
    <td colspan="11" class="separator">&nbsp;</td>
</tr>

I have the following XPath, which allows me to correctly match an entire string of interest.

My question is : how can I select this tralong with the next two elements tr(after it).

$xpath->query("//table[@id='mainGrid']//tr[descendant::a[contains(@href,'horse_home')]]"
+3
source share
4 answers

Using

//table[@id='mainGrid']
      //tr[descendant::a
              [contains(@href,'horse_home')]
          ]
 |
    //table[@id='mainGrid']
          //tr[descendant::a
                  [contains(@href,'horse_home')]
              ]
               /following-sibling::tr[not(position() > 2)]

This XPath expression decodes your previous choice, indicating that you should choose to combine it with a maximum of two trnext brothers (from the previous selected item tr).

+3
source

, :

//table[@id='mainGrid'] 
   //tr[(self::tr|preceding-sibling::tr[not(position() > 2)])
              [descendant::a 
                  [contains(@href,'horse_home')] 
              ]
       ] 

, :

<table id="mainGrid">
    <tr>1</tr>
    <tr>2</tr>
    <tr>3</tr>
    <tr>
        <a href="/horses/horse_home.sd"/>
    </tr>
    <tr>5</tr>
    <tr>6</tr>
    <tr>7</tr>
    <tr>
        <a href="/horses/horse_home.sd"/>
    </tr>
    <tr>8</tr>
    <tr>9</tr>
    <tr>10</tr>
</table>

:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
  <xsl:copy-of select="
//table[@id='mainGrid']
   //tr[(self::tr|preceding-sibling::tr[not(position() > 2)])
              [descendant::a
                  [contains(@href,'horse_home')]
              ]
       ]
"/>
</xsl:template>
</xsl:stylesheet>

:

<tr>
    <a href="/horses/horse_home.sd" />
</tr>
<tr>5</tr>
<tr>6</tr>
<tr>
    <a href="/horses/horse_home.sd" />
</tr>
<tr>8</tr>
<tr>9</tr>
+1

$xpath->query("//table[@id='mainGrid']//tr[descendant::a[contains(@href,'horse_home')] | //table[@id='mainGrid']//tr[descendant::a[contains(@href,'horse_home')]/following-sibling::tr[position() < 3]" - (, -, ).

With XPath 2.0 (possibly not supported by your PHP API) you can use $xpath->query("//table[@id='mainGrid']//tr[descendant::a[contains(@href,'horse_home')]/(., following-sibling::tr[position() < 3]).

0
source

Then you definitely need to use the Xpath axis. following-siblingandprevious-sibling

Your expression then should look something like this:

$xpath->query("//table[@id='mainGrid']/tr[descendant::a[contains(@href,'horse_home')]/following-sibling::tr[2]")
0
source

Source: https://habr.com/ru/post/1777205/


All Articles