Как использовать 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'))]
Ответы
Ответ 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()