Как использовать not contains () в xpath?

у меня есть 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 ответов


запросы XPath чувствительны к регистру. Посмотрев на ваш пример (который, кстати, потрясающий, никто, кажется, больше не дает примеров!), Я могу получить результат, который вы хотите, просто изменив "бизнес"на " бизнес"

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

Я проверил это, открыв XML-файл в Chrome и используя инструменты разработчика для выполнения запросов XPath, и это дало мне только категорию фильма.


мне нужно выбрать каждое производство с категорией, которая не содержит "бизнес"

хотя я поддержал ответ @Arran как правильный, я бы также добавил Это... Строго интерпретируемая спецификация OP будет реализована как

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

, а не

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

последний выбирает каждую продукцию, чья первый category ребенок не содержит "бизнес". Два выражения XPath будут вести себя по-разному когда production нет category дети, или больше чем одно.

это не имеет никакого значения на практике, так как каждый <production> есть ровно один <category> child, как в вашем коротком примере XML. Всегда ли вы можете рассчитывать на то, что это правда или нет, зависит от различных факторов, таких как наличие схемы, которая применяет это ограничение. Лично я бы пошел на более надежный вариант, так как он не "стоит" много... предполагая, что ваше требование, как указано в вопросе действительно правильно (в отличие от, например, "выберите каждое производство, которое не имеет категории, содержащей"бизнес"").


можно использовать not(expression) функции

not() является функцией в xpath (в отличие от оператора)

пример:

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

или

expression != true()

должно быть / / производство[не (содержит (категория, "бизнес"))]