Одна из проблем с ответом, приведенным выше, заключается в том, что он также будет выбирать элементы, которые вообще не имеют атрибута "foo". Рассматривать:
div: not ([foo = '']) выберет как первый, так и второй элементы div. Если вы просто хотите, чтобы элементы div имели атрибут foo с пустой строкой, вы должны использовать:
div[foo]:not([foo=''])
В последнем примере, если вы хотите, чтобы все элементы с атрибутом foo отличались от "y" или "z", вы должны использовать:
div[foo]:not([foo='y']):not([foo='z'])
И, конечно, div можно вообще отключить, если выбрать элементы, отличные от div.