5

次のようなテーブルがあります。

<table>
  <th>
    <td>Area</td><td># of errors</td>
  </th>
  <tr><td>school</td><td>23</td></tr>
  <tr><td>student</td><td>0</td></tr>
  <tr><td>school</td><td>17</td></tr>
  <tr><td>student</td><td>0</td></tr>
</table>

「学校」エリアの最後の行を選択するにはどうすればよいですか。

最近まで assert_text を使っていました

//table//tr//td[contains(text(),'school')]/following::td

avalueは 0、つまりゼロ エラーです。

ただし、エラーのある行を考慮する必要がありますが、エラーがゼロの「最後の」行 (領域) を見てください。
この場合、

//table//tr//td[contains(text(),'school')]/following::td

は、23 個のエラーがある最初の行を誤って選択します。

使ってみたtr[last()]-

//table//tr[last()]//td[contains(text(),'school')]/following::td[2]

しかし問題は、これが学生用の最後のテーブル行を選択することです。学校用の最後のテーブル行が必要です (実際には、すべての行の最後のテーブル行の 2 番目です)。

私も試しました:

//table//td[contains(text(),'school')][last()]/following::td[2]

しかし、それは機能しませんでした (まだ「最初の」学校の行が選択されています)。

1 つの学校の行、2 つの学校の行、および 2 つ以上の学校の行を説明できるようにする必要があるため、それを処理するのに十分な動的な式が必要です。

4

2 に答える 2

6

「学校」というテキストを含む要素を検索していますが、マークアップには「学校」というテキストが含まれています。XPath では大文字と小文字が区別されます。

大文字を小文字に変換することでこれを回避できます。これにより、XPath は次のようになります。

//td[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'school')][last()]/following::td[2]

*ノート*

XPath2 の lower-case() 関数は、すべてのブラウザーで機能するとは限らないため、使用しませんでした。

*編集*

大文字と小文字を区別しない新しいマークアップ用に更新された xpath は次のようになります。

//tr[td[contains(translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'school')]][last()]/td[2]

または、大文字と小文字を区別しない、より単純化されたバージョンは次のようになります。

//tr[td[contains(., 'school')]][last()]/td[2]

(. は text() の省略形です。必要に応じて入れ替えることができます)

あなたはおそらく逃げることもできます

//tr[td[.='school']][last()]/td[2]
于 2013-04-12T15:52:18.353 に答える
2

あなたの最終的なXPathを使用すると、それは私にとってはうまくいき、最後の「学校」を選択します。だから私はあなたが使っているすべてのもののバージョン、どのブラウザなどを尋ねます

また、XPath を使用する場合、位置インデクサーが少し面倒になることがあります。

(//td[contains(text(),'School')])[last()]/following::td[2]
于 2013-04-12T15:04:51.010 に答える