2012-10-22 5 views
6

は、私はあなたが次のようにunion演算子を使用することができることを知っている:XPathでは、ノード名でOR演算子を使用できますか? XPathので

//*[@id="Catalog"]/thead | //*[@id="Catalog"]/tbody 

これは、しかし、私には少し厄介であると考えられます。代わりにこれらの1つに似た何かをする方法はありますか?

私にはもっとたくさん読みやすく、直感的なようだ
//*[@id="Catalog"]/(thead|tbody) 
//*[@id="Catalog"]/(thead or tbody) 
//*[@id="Catalog"]/*[nodename="thead" or nodename="tbody"] 

...

答えて

5

の式中:かどうかを確認するための第三の方法は、まだあり

//*[@id="Catalog"]/*[self::thead or self::tbody] 

//*[@id="Catalog"]/*[name()="thead" or name()="tbody"] 

は、この式は、より効率的である

正しいことの名前可能な名前のmumberが(無制限と未知の長さの)非常に長い場合には特に実用的であることができ、この最後の手法を用いて

//*[@id="Catalog"]/*[contains(''|thead|tbody|',concat('|',name(),'|'))] 

:要素は文字列の指定されたシーケンスの一つです。可能な名前のパイプで区切られた文字列は、外部パラメータとして変換に渡すこともできます。その一般性、再利用性、および「DRY」性が大幅に向上します。

0

はい、あなたが使用することができます。

//*[@id="Catalog"]/[nodename='thead' or nodename='tbody'] 

EDIT:

ただ、再読み込み、あなたのオリジナルのポストとあなたが求めていたことを理解しました。上記の構文は、この状況では正しくありません。

//*[@id="Catalog"]/*[name()="thead" or name()="tbody"] 
+0

「[」より前の星は忘れてしまいます。 (私は投稿を編集するだけですが、StackOverflowでは6文字未満の編集を許可していません) – Ajedi32

+0

また、これはどこに文書化されているのでしょうか? =) – Ajedi32

+0

申し訳ありません、それはタイプミスでした。そこに星(または他の要素名)が必要です。 –

4

わかりません。しかし、このアプローチはXPath 1.0では動作しません。

2

注意するXPath 2.0を使用しての試み//*[@id="Catalog"]/(thead|tbody)が正しいこと:あなたがname()機能を探している方法を使用するノードの名前を取得するのではなく、右のノード名ではありません...

関連する問題