web-dev-qa-db-ja.com

xpathでnot contains()を使用するには?

このような構造のXMLがいくつかあります。

<whatson>
  <productions>    
    <production>
      <category>Film</category>
    </production>
    <production>
      <category>Business</category>
    </production>
    <production>
      <category>Business training</category>
    </production>
  </productions>
</whatson>

そして、「Business」を含まないカテゴリーを持つすべてのプロダクションを選択する必要があります(この例では最初のプロダクションのみです)。

これはxpathで可能ですか?私はこれらの線に沿って作業しようとしましたが、どこにも行きませんでした:

//production[not(contains(category,'business'))]
61
Jason

XPathクエリでは大文字と小文字が区別されます。あなたの例を見てみましょう(ちなみに、これはすごいです、もう誰も例を提供してくれないようです!)

//production[not(contains(category,'Business'))]

これをテストするために、ChromeでXMLファイルを開き、開発者ツールを使用してそのXPathクエリを実行すると、映画カテゴリのみが返されました。

110
Arran

「ビジネス」を含まないカテゴリのすべての制作を選択する必要があります

私は@Arranの答えを正しいと主張しましたが、これも追加します...厳密に解釈すると、OPの仕様は次のように実装されます

//production[category[not(contains(., 'Business'))]]

のではなく

//production[not(contains(category, 'Business'))]

後者は、firstcategory子に「Business」が含まれていないすべてのプロダクションを選択します。 productioncategory子がない場合、または複数の場合、2つのXPath式の動作は異なります。

短いサンプルXMLのように、すべての<production><category>子が1つだけあれば、実際には違いはありません。常にそれが当てはまるかどうかは、その制約を実施するスキーマがあるかどうかなど、さまざまな要因によって決まります。個人的には、「コスト」があまりかからないため、より堅牢なオプションを選択します...質問に記載されている要件が本当に正しいと仮定すると(たとえば、「カテゴリのないすべての制作を選択する」 「ビジネス」を含む ')。

25
LarsH

not(expression)関数を使用できます

not()は(演算子ではなく)xpathの関数です

例:

//a[not(contains(@id, 'xx'))]

OR

expression != true()
1
Shubham Jain

// production [not(contains(category、 'business'))]でなければなりません

0
bace bogo