2012-06-20 12 views
11

id="mydiv"を持つすべてのdom要素を選択しようとしていますが、class="exclass"も持つ要素は除外しています。今すぐ最初の部分をやっています//*[@id="mydiv"]。クラス除外部分を追加するにはどうすればよいですか?xpathはクラスを持つ要素を除外する

P.S.なぜ同じIDを持つ複数の要素を選択する必要があるのだろうと思っている場合、私は制御できない既存のDOMに取り組んでいます。最後の(やや)奇数ロジックは何に変換することができます

//*[@id="mydiv" and (not(@class) or @class!="exclass")] 

class属性は、すべてのノードに存在しない可能性がある場合は、あなたがこれを必要と

//*[@id="mydiv and @class!="exclass"] 

+0

あなたは同じIDを持つ複数の要素を持っていますか?それは健康ではない、あなたは知っている。 http://stackoverflow.com/questions/2487074/what-are-the-side-effects-of-using-multiple-instances-of-a-single-id-name-in-htm – jolt

答えて

17

あなたは否定を使用することができますマイケル提案:

ただし、個人的には、XPathでは比較できません属性が欠落している場合は、欠点のように感じます。

+0

これはまったくではありませんユーザーが尋ねたダウン投票。私の答えを見てください。 –

+0

@MichaelKayそれを指摘してくれてありがとう、私は私の答えを更新しました。私の更新で述べたように、「何も何にも比較できない」ということは、xpathの欠点の多少であると感じています。その動作が有用である理由は考えられません:/ –

5

書かれた質問への答えは

//*[@id="mydiv" and not(@class="exclass")] 

が@id属性であり、その値はmydivであれば条件の前半が真です。後半は、値がexclassの@class属性がない場合はtrueです。つまり、クラス属性がない場合、またはクラス属性があり、その値が "exclass"以外の場合です。

この状況では、90%の確率で!=を使用しないでください。A=Bと書いてみると、おそらくnot(A=B)が必要です。意味は、AまたはBのいずれかがシングルトンでない場合、つまり空でも複数の値を含む場合でも異なります。

+0

TriXPath(トリックのように)ルール! – jolt