84

次のように構造化されたXMLがあります。

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

そして、「ビジネス」を含まないカテゴリのすべてのプロダクションを選択する必要があります(したがって、この例の最初のプロダクションのみ)。

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

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

4 に答える 4

153

XPathクエリでは大文字と小文字が区別されます。あなたの例を見て(ちなみに、これは素晴らしいです、もう誰も例を提供していないようです!)、「ビジネス」を「ビジネス」に変更するだけで、あなたが望む結果を得ることができます

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

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

于 2012-06-13T22:18:32.863 に答える
27

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

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

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

それよりも

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

後者は、最初の category子に「ビジネス」が含まれていないすべてのプロダクションを選択します。productionに子がない場合category、または複数の場合、2つのXPath式の動作は異なります。

短い例のXMLのように、すべてに子<production>が1つしかない限り、実際には何の違いもありません。<category>それが常に真であると信頼できるかどうかは、その制約を適用するスキーマがあるかどうかなど、さまざまな要因によって異なります。個人的には、「コスト」がそれほど高くないので、より堅牢なオプションを選択します...質問に記載されている要件が本当に正しいと仮定します(たとえば、カテゴリを持たないすべてのプロダクションを選択するのではなく) 「ビジネス」を含む')。

于 2012-06-14T04:25:53.620 に答える
6

not(expression)機能が使えます

not()xpathの関数です(演算子ではありません)

例:

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

また

expression != true()
于 2017-10-23T10:04:49.013 に答える
1

contains()メソッドを含まないxpathである必要があります。//production[not(contains(category,'business'))]

于 2018-08-19T18:02:38.290 に答える