11

次のサンプルドキュメントがあります。

<root>
  <p class="b">A</p>
  <p class="b">B</p>
  <p class="a">C</p>
  <p class="a">D</p>
  <p class="b">E</p>
  <x>
    <p class="b">F</p>
  </x>
</root>

兄弟ではなく、一致するクラス属性を持つ特定のノードのすべての直接の兄弟を選択する xpath 式を探しています。上記の例では、最初の 2 つの<p class="b">AB を選択する必要があります。同様に2枚の<p class="a">CD、同様に5番目のシングル<p class="b">Eは、直接の兄弟がいないためです。同様に、 の中に単一の<p class="b">F があり<x>ます。このコンテキストでは、B と C は異なるクラス属性の値を持っているため、直接の兄弟ではないことに注意してください。

私が持っているのはこれです:

xml.xpath("//p") # This selects all six <p> elements.
xml.xpath("//p[@class='b']") # This selects all four <p class="b"> elements.
xml.xpath("//p/following-sibling::p[@class='b']") # This selects all <p class="b"> sibling elements, even though not direct siblings.

最後の式は、5 番目の兄弟も選択しますが、間に一致しない兄弟があります。

class同じ値を持つ直接の兄弟のみを選択するにはどうすればよいですか?

編集明確にするために:最後の2つが兄弟ではなく個々の選択であることに注意してください!

編集ここに例を保存しました。に基づく Xpath 式/root/p[1]は、select を想定していますA, B, C, D

4

2 に答える 2

18

次の兄弟を取得するには、位置を追加できます - 1 はすぐそばを意味します。

following-sibling::*[1]

次の兄弟が特定のノード タイプであることを確認するには、次のフィルターを追加できます。ここで、p は一致させたいノード タイプです。

[self::p]

同じ属性のものだけが必要な場合は、最初の p 要素にも属性を指定する必要があります。

したがって、class bp 要素の直後にある class bp 要素だけが必要な場合は、次のようにします。これにより、2 番目の p 要素が得られます。

//p[@class='b']/following-sibling::*[1][@class='b'][self:p]

別のクラス b 要素に隣接するクラス b 要素が実際に必要なように思えます。その場合、前後の兄弟を確認できます。次の例では、最初の 2 つの p 要素が得られます。

//p[@class='b'][following-sibling::*[1][@class='b'][self::p] 
                or preceding-sibling::*[1][@class='b'][self::p]]    
于 2013-10-18T20:31:31.233 に答える