13

XPathを使用すると、union演算子を次のように使用できることがわかります。

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

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

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

それは私にははるかに読みやすく直感的に思えます...

4

4 に答える 4

11

表現しながら:

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

正しい

この式はより効率的です:

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

要素の名前が指定された文字列のシーケンスの1つであるかどうかを確認する3番目の方法がまだあります

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

この最後の手法を使用すると、可能な名前の数が非常に長い場合(無制限で長さが不明な場合)に特に実用的です。パイプで区切られた可能な名前の文字列は、外部パラメーターとして変換に渡すこともできます。これにより、その一般性、再利用性、および「DRY」性が大幅に向上します。

于 2012-10-23T04:14:28.623 に答える
5

あなたは関数を探していname()ます:

//*[@id="Catalog"]/*[name()="thead" or name()="tbody"]
于 2012-10-22T14:46:11.000 に答える
3

//*[@id="Catalog"]/(thead|tbody)XPath 2.0では、試行が正しいことに注意してください。ただし、このアプローチはXPath1.0では機能しません。

于 2012-10-22T15:39:28.087 に答える
0

はい、使用できます:

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

編集:

元の投稿を読み直して、あなたが求めていたことに気づきました。上記の構文は、この状況では正しくありません。使用するノードの名前を取得する方法がわかりませんが、ノード名が正しくありません...

于 2012-10-22T14:37:44.653 に答える