Краткий ответ: ваш селектор не выражает то, что вы думаете.
Оператор or
равен объединению.
Частьуказанной вами спецификации («Правильный операнд не вычисляется ...») является частью стандартного короткого замыкания логической логики .
Вот почему вы получаете набор из 2 узлов для вашегоПример ввода: XPath просматривает каждый myelement
, который является дочерним элементом rootelement
, и применяет часть [@type='specific' or position()=1]
к каждому такому узлу, чтобы определить, соответствует ли он селектору.
<myelement>test1</myelement>
не соответствует @type='specific'
, но соответствует position()=1
, поэтому соответствует целому селектору. <myelement>test2</myelement>
не соответствует @type='specific'
и не соответствует position()=1
, поэтомуон не соответствует целому селектору. <myelement type='specific'>test3</myelement>
соответствует @type='specific'
(поэтому XPath не нужно проверять свою позицию - это короткозамкнутая часть), поэтому он соответствует целому селектору.
Первый и последний <myelement>
s соответствуют целому селектору, поэтому он возвращает набор из 2 узлов.
Самый простой способ выбрать элементы так, как вы хотите, это сделать это в два этапа.Вот псевдокод (я не знаю, в каком контексте вы на самом деле используете XPath, и я не очень знаком с написанием селекторов синтаксиса XPath):
- Выберите
elements
, которые соответствуют /rootelement/myelement[@type='specific']
- Если
elements
пусто, выберите elements
, что соответствует /rootelement/myelement[position()=1]