как работает оператор if в xpath?

Если у нас есть выражение xpath if:

  if(test-expression) then (expresion) else (someOtherExpression),

и мы говорим, что тестовое выражение представляет собой путь с некоторым условием (например, //Element1[text() != '']), и у нас есть несколько узлов Element1, делает ли оператор if вход в каждый узел Element1 и проверяет условие или только первый?

пример:

<Element1></Element1>
<Element1>Test</Element1>

Если заявление:

 if(//Element1[text()!='']) then ('result1') else ('result2')

вернет ли это результат2 для первого элемента, а затем проверит второй элемент и вернет1 или это не так, как работает xpath?

Я действительно новичок в xpath, и нигде не могу найти эту информацию.


person n32303    schedule 08.09.2014    source источник


Ответы (1)


вернет ли это результат2 для первого элемента, а затем проверит второй элемент и вернет1 или это не так, как работает xpath?

Нет, он оценит тестовое выражение, преобразует его в логическое значение, а затем, если тест был истинным, он вернет result1, а если ложный, он вернет result2.

Для этого конкретного примера

//Element1[text()!='']

- это выражение, которое вернет последовательность всех тех узлов Element1, у которых есть хотя бы один дочерний текстовый узел, который не является пустым - он найдет <Element1>Test</Element1> и <Element1>Te<br/>st</Element1>, но не <Element1><span>Test</span></Element1>, потому что у Element1 нет ни одного текстовый узел дочерний вообще, только узел элемента (span). Если вы хотите поймать и этот последний пример, вы можете использовать . != '' вместо text() != ''.

Правило преобразования последовательности узлов в логическое значение состоит в том, что пустая последовательность false, а непустая последовательность — true. Поэтому общее выражение

if(//Element1[text()!='']) then ('result1') else ('result2')

вернет result1, если в документе есть хотя бы один элемент Element1, у которого есть непустой текстовый дочерний узел, и result2 в противном случае.


Если вы хотите проверить каждый Element1 по очереди и вернуть последовательность из result1/result2 для каждого узла, вам нужно выражение for

for $elt in (//Element1) return (if ($elt != '') then 'result1' else 'result2')
person Ian Roberts    schedule 08.09.2014
comment
Спасибо. Отличный ответ. - person n32303; 08.09.2014
comment
Может быть, вы знаете, как я могу оценить этот цикл for в C#? - person n32303; 08.09.2014