Используйте это выражение:
//item[not(rentalterm='2')]/isbn/text()
На английском языке: Получить текстовые узлы любого элемента isbn
, родительским элементом которого является элемент item
, не имеющий дочернего элемента rentalterm
, чейзначение равно 2
Контрастность с этим выражением:
//item[rentalterm!=2]/isbn/text()
... что означает: Получить текстовые узлы любого элемента isbn
родителем которого является элемент item
, имеющий хотя бы одного дочернего элемента rentalterm
, значение которого не равно 2
.
Другими словами, это второе выражение не будет соответствовать item
элементы, у которых нет rentalterm
дочерних элементов, но будет соответствовать item
элементам с несколькими rentalterm
дочерними элементами, если хотя бы один из них не имеет строкового значения, равного 2
.
Иными словами, предикат [not(rentalterm='2')]
можно прочитать, так как не содержит rentalterm
потомка, строковое значение которого равно 2
, тогда как [rentalterm!=2]
следует читать как содержит rentalchild
, строковое значение которого не равно 2
.
спецификация описывает это так: :
Если один сравниваемый объект является набором узлов, а другой является строкой, то сравнение будет истинным, если и только если существует узелв наборе узлов, так что результатом выполнения сравнения строкового значения узла и другой строки является истина.