Выражение not(X='value')
возвращает true, если набор узлов, выбранных X, не включает в себя узел, строковое значение которого равно value
. Это включает в себя случай, когда набор узлов, выбранных X, пуст, то есть, где узел отсутствует.
Теперь вопрос в том, что вы хотите, чтобы ваше выражение возвращало? Если вы хотите, чтобы он возвращал соответствующий элемент, если он существует и имеет требуемое значение, или пустой набор узлов, в противном случае вы можете просто написать
//personName[. = 'novice']
Если вы хотите вернуть логическое значение, которое сообщает вамсуществует ли такой узел, вы можете написать
boolean(//personName[. = 'novice'])
На самом деле вы можете сократить его до
//personName = 'novice'
, хотя я лично считаю это менее ясным, и у него есть недостаток, заключающийся в том, что вы можетеНе применяйте то же сокращение к более сложным предикатам, таким как
//personName[starts-with(., 'novice')]
Если вы хотите получить обратное (верните true, если элемент не существует или не имеет правильного значения), тогда
not(//personName[. = 'novice'])