2

このHTMLから:

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

xPath式を取得して、すべてのtr [@ class ='first']ノードに続いて、最初のノードを含む「最初の」クラスを持たないtrを返そうとしています。この場合、tr ids 1、2、3およびtrのids 4、5、6のセット。

私は使用してみました:

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

成功しませんでした。これについて何か考えはありますか?

ありがとう

4

1 に答える 1

0

正確には必要なものではありませんが、この式は最初と最後のクラスの間のすべてのノードを返しますが、それらをグループ化することはありません。これは、1つのXPath式で実行できる最善の方法です。

このような入力が与えられると、

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

このXPath式、

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

これらのノードを返します:

<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この式は、前の兄弟が「最初」であり、次の兄弟が「最後」であるすべての要素をチェックすることによって機能します。そうすればtr、それらの外のを除外します。

ただし、グループ化は行いません。単一のXPath式を使用してそのようなグループ化を行う方法はわかりません。それを行う必要がある場合は、1つのXPath式ですべての「最初の」を返し、tr「最後の」が見つかるまでその兄弟を移動しますtr。たぶん他の誰かがこれを行うためのより良い方法を知っています。

于 2010-07-13T12:19:20.857 に答える