I am using the following XPath expression to select table cells from
the first row of the first table, by combining the results for <th>
and <td>. This works fine, I get both cells back.
Note that the first table combines <th> and <td> in a single row.
(((descendant-or-self::html/descendant-or-self::table)[1]//tr)[1]/td|((descendant-or-self::html/descendant-or-self::table)[1]//tr)[1]/th)
2 results:
<th>Cell 1</th>
<td>Cell 2</td>
When I try to get the first cell by appending [1] to the expression
I get the second cell back instead of the first. Why?
The expected result of this expression is '<th>Cell 1</th>'
(((descendant-or-self::html/descendant-or-self::table)[1]//tr)[1]/td|((descendant-or-self::html/descendant-or-self::table)[1]//tr)[1]/th)[1]
1 result:
<td>Cell 2</td>
Appending [2] yields the second cell successfully. But why not the first?
(((descendant-or-self::html/descendant-or-self::table)[1]//tr)[1]/td|((descendant-or-self::html/descendant-or-self::table)[1]//tr)[1]/th)[2]
1 result:
<td>Cell 2</td>
Similarly, for the second table I can get all cells with this expression.
The second table only contains <th> cells in the first row.
(((descendant-or-self::html/descendant-or-self::table)[2]//tr)[1]/td|((descendant-or-self::html/descendant-or-self::table)[2]//tr)[1]/th)
2 results:
<th>Cell 1</th>
<th>Cell 2</th>
However, when I append [1] to get only the first cell back, I get an empty result.
The expected result for this expression is '<th>Cell 1</th>'
(((descendant-or-self::html/descendant-or-self::table)[2]//tr)[1]/td|((descendant-or-self::html/descendant-or-self::table)[2]//tr)[1]/th)[1]
0 results
The second cell can be retrieved successfully by appending [2].
But why not the first?
(((descendant-or-self::html/descendant-or-self::table)[2]//tr)[1]/td|((descendant-or-self::html/descendant-or-self::table)[2]//tr)[1]/th)[2]
1 result:
<th>Cell 2</th>
Note that by replacing the first 'descendant-or-self' with '//' the expression
seems to work as expected in all cases for both the first and second table:
(((//html/descendant-or-self::table)[1]//tr)[1]/td|((//html/descendant-or-self::table)[1]//tr)[1]/th)
2 results:
<th>Cell 1</th>
<td>Cell 2</td>
(((//html/descendant-or-self::table)[1]//tr)[1]/td|((//html/descendant-or-self::table)[1]//tr)[1]/th)[1]
1 result:
<th>Cell 1</th>
(((//html/descendant-or-self::table)[1]//tr)[1]/td|((//html/descendant-or-self::table)[1]//tr)[1]/th)[2]
1 result:
<td>Cell 2</td>
(((//html/descendant-or-self::table)[2]//tr)[1]/td|((//html/descendant-or-self::table)[2]//tr)[1]/th)
2 results:
<th>Cell 1</th>
<th>Cell 2</th>
(((//html/descendant-or-self::table)[2]//tr)[1]/td|((//html/descendant-or-self::table)[2]//tr)[1]/th)[1]
1 result:
<th>Cell 1</th>
(((//html/descendant-or-self::table)[2]//tr)[1]/td|((//html/descendant-or-self::table)[2]//tr)[1]/th)[2]
1 result:
<th>Cell 2</th>