2016-12-02 5 views
1

Xpath(1.0)を書いて、共通の基本要素で異なるタグタイプと深さのレベルを持つ要素を選択するところです。例えば、私はGoogleのサイトで次のXPathを使用することができます。要素または別の要素の子を選択するために書くことができる最短のXpathは何ですか?

//*[@id='main']/span | //*[@id='main']/div/script

...次のHTMLで:

<div id="main" class="content" data-jiis="cc"> 
    <span id="body" class="ctr-p"> 
    <div id="footer" class="ctr-p"> 
    <div id="footc" data-jiis="uc" data-jibp="h"> 
     <script> 
     <div id="xfoot">...</div> 
    </div> 
</div> 

私は多くの線に沿って何かとしてそれを好むだろうけどの:違法表現である

//*[@id='main'](/span | /div/script)

...。私はいくつかのselfものを試してみましたが、私はむしろdivよりも、それはscriptをつかむために取得する方法を見つけ出すことはできません。

//*[@id='main']/*[self::span | self::div/script]

私はself::div/scriptscript子供とdivを選択することを意味することを理解し、この例ではscriptを選択する軸(存在する場合)がわかりません。どうすればこれを達成できますか?または、私が記述した最初のXpathを使用する必要がありますか?

+0

XPath式を使用するコンテキスト/言語は何ですか? – choroba

+0

http://stackoverflow.com/a/4616333/1030675 – choroba

+0

@choroba私はJavaでSeleniumを使用しています。 –

答えて

3

XPath式の途中にオプションの軸を配置することはできません。あなたはしかし、裏返しクエリを変えることができます:XPath 2.0の中

//*[self::span or self::script[parent::div]][ancestor::div[@id="main"]] 
+0

'[self :: span or self :: script [parent :: div]]'セグメントで、 'または'を使うことの違いは何ですか? –

+0

'[' 'あなたは論理式を持っていますか。対照的に、 '|'は論理レベルではなくノードセットレベルであり、元の質問のように2つのノードセットをマージします。私は論理 'と'のためのanalogonになる "交差点"がないと思う –

1

をあなたは

//*[@id='main']/(span | div/script) 

を書くことができます。しかし、あなたは本当にこのような質問をしている場合はそれが1.0

に法的ではありませんあなたが話しているXPathバージョンを指定する必要があります。

+1

私はそれがv1が意味していたと思った。 – choroba

関連する問題