3

次のHTMLのaノード( )に続く最初の入力ノードの属性値を取得するためのXPath式を作成するにはどうすればよいですか。value A

<a href="http://www.link.com">link</a>
<input value="value A" />
<input value="value B" />

私は試した:

//input[(preceding-sibling::a[1])]/@value

aただし、ノードが最も近い先行する兄弟であるノードの属性のみが必要な場合、これは両方の入力ノードのvalue属性を取得します。

4

1 に答える 1

3

[1]間違ったノードで述語を使用しています。特定のレベルでpreciding-sibling::a最初の要素に続くすべての入力ではなく、を含む最初の入力が必要です。a

これにより、正しい結果が得られるはずです。 //a/following-sibling::input[1]/@value

つまりa、ドキュメント内の任意のレベルで見つかったすべての要素inputについて、その兄弟でありながら、それに続く最初の要素を選択します。次に、そのvalue属性を読み取ります。

この入力の場合:

<xml>
  <p>
    <input value="value A" />
    <a href="http://www.link.com">link</a>
    <input value="value B" />
    <input value="value C" />
  </p>
  <p> 
    <a href="http://www.link.com">link</a>
    <input value="value D" />
    <input value="value E" />
    <a href="http://www.link.com">link</a>
    <input value="value F" />
  </p>
</xml>

それは戻ります:

  • 値B
  • 値D
  • 値F

編集

aこれは、とそれに続く最初の要素の間に要素がない場合に機能inputします。

たとえば、次のような入力を使用します。

    <a href="http://www.link.com">link</a>
    <strong>OMG NOEZ!</strong>
    <input value="value A" />

値Aはまだ選択されています

よろしければ、上記の式をそのままにしてください。そうでない場合は、次のように変更して、他の要素をフィルタリングします。

//a/following-sibling::*[1][self::input]/@value

aこれにより、タグが何であるかに関係なく、の最初の次の兄弟が選択され、選択された後にのみ実際のタグがチェックされます。このようにinput、同じレベルでさらに進んだものは選択されません。

于 2012-08-25T22:46:32.017 に答える