Подтвердить что ты не робот

Как использовать 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'))]
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

а не

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

Последний выбирает каждое производство, чей первый category ребенок не содержит "Бизнес". Два выражения XPath будут вести себя по-разному, если production не имеет дочерних элементов category или более одного.

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

Ответ 3

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

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

Пример:

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

или

expression != true()