2013-08-22 2 views
4

Мой вопрос касается порядка выполнения в XPath.Выполняет ли XPath короткую проверку логических выражений?

У меня есть такое выражение, как:

//person[@created and customFunction(.)] 

Моя проблема заключается в том, что моя пользовательская функция достаточно вычислить тяжелый, и я хотел бы лишь для того, чтобы работать на узлах, которые установили созданный атрибут. Будет ли @created всегда оцениваться до customFunction? Я мог бы подготовить программу для проверки этого, но на самом деле успех такого эксперимента не является гарантией, по крайней мере, не в долгосрочной перспективе.

Если это вопрос реализации XPath, я использую .NET 4.0.

+0

Я знаю, что это старый вопрос, но я думаю, что мой новый ответ - это то, что вы ищете. – sergioFC

ответ

3

XPath 1.0 делает оценки короткого замыкания, в XPath 2.0 и XPath 3.0 так ли зависит от реализации.

По XPath 1.0 specs, section 3.4: booleans:

или выражение [...] Правый операнд не вычисляется, если левый операнд принимает значение истинного.

и выражение [...] Правый операнд не вычисляется, если левый операнд оценивает ложному.

Согласно XPath 2.0 specs, section 3.6: Logical Expressions и XPath 3.0 specs, section 3.8: Logical Expressions:

Если режим XPath 1.0 Совместимость верно [...] определено, что, когда нет необходимости оценивать второй операнд для того, чтобы определить результат, тогда ошибка может возникнуть в результате оценки второго операнда.

Если режим совместимости 1.0 XPath ложно, то порядок, в котором оценивали операнды логического выражения зависит от реализации. В этом случае or-expression может возвращать true, если первое оцениваемое выражение истинно и может вызвать ошибку , если оценка первого выражения вызывает ошибку. Аналогично, выражение and-expression может возвращать значение false, если первое выражение оценивается как ложное и может вызвать ошибку, если оценка первого выражения вызывает ошибку. В результате этих правил логическое выражение не является детерминированным при наличии ошибок, как , проиллюстрированное в примерах ниже.

При использовании XPath 2.0 или XPath 3.0 можно узнать, имеет ли текущая реализация оценки короткого замыкания путем вычисления следующий пример выражение:

true() or name(1234) 

Функция name возвращает имя параметра узла , или он вызывает ошибку, если вы передадите его, например, номер, так что:

  • Если он возвращает true без повышения ошибки, то реализация выполняет оценку короткого замыкания.
  • При возникновении ошибки реализация не выполняет оценку короткого замыкания (поскольку она оценила правый операнд, который не был необходим).
3

Вы можете также записать его в виде

//person[@created][customFunction(.)] 

Таким образом, он будет оценен только для подмножества отфильтровать с помощью первого предиката

+0

Обратите внимание, что это не то же самое, семантически (см. Http://stackoverflow.com/a/1006439/18771). В этом случае это не имеет никакого значения. – Tomalak

+1

Это практическое решение, и спасибо за это! Однако он не отвечает на мой первоначальный вопрос. – Marcus

Смежные вопросы