を持つすべての dom 要素を選択しようとしていますが、.id="mydiv"
を持つものは除外しますclass="exclass"
。今は前編をやってい//*[@id="mydiv"]
ます。クラス除外部分を追加するにはどうすればよいですか?
PS なぜ同じ ID を持つ複数の要素を選択する必要があるのか 疑問に思っている場合は、制御できない既存の DOM で作業しているだけです。
を持つすべての dom 要素を選択しようとしていますが、.id="mydiv"
を持つものは除外しますclass="exclass"
。今は前編をやってい//*[@id="mydiv"]
ます。クラス除外部分を追加するにはどうすればよいですか?
PS なぜ同じ ID を持つ複数の要素を選択する必要があるのか 疑問に思っている場合は、制御できない既存の DOM で作業しているだけです。
否定を使用できます。
//*[@id="mydiv" and @class!="exclass"]
属性がすべてのノードに存在しない可能性がある場合はclass
、これが必要です。
//*[@id="mydiv" and (not(@class) or @class!="exclass")]
最後の (やや) 奇妙なロジックは、Michael が提案したものに変えることができます。
//*[@id="mydiv" and not(@class="exclass")]
ただし、個人的には、属性が欠落している場合に XPath が比較を行うことができないという事実は、少し欠点のように感じます。
書かれた質問への答えは
//*[@id="mydiv" and not(@class="exclass")]
@id属性があり、その値がmydivの場合、条件の前半はtrueです。後半は、値がexclassの@class属性がない場合、つまり、クラス属性がない場合、またはクラス属性があり、その値が「exclass」以外の場合に当てはまります。
この状況では!=の使用を避けてください。90%の確率で、書くことを考えている場合はA!=B
、おそらくnot(A=B)
。AまたはBのいずれかがシングルトンでない場合、つまり、空であるか、複数の値を含むことができる場合は、意味が異なります。