Xpoint
   [напомнить пароль]

Тернарный оператор (if/then/else) средствами XPath: История

Внимание! Данный интерфейс находится в стадии глубокой переделки. Наберитесь терпения.

Последнее изменение

11 лет назад GRAy[досье] изменил текст:
Текст:
== Постановка задачи¶

_Нужен нормальный аналог оператора_ =#($congcond) ? ($one) : ($two)#= _в рамках XPath 1.0._¶

== Стандартное решение через xsl:choose и его недостатки¶

= Решение на чистом XPath 1.0¶
== Решение¶

Воспользуемся тем фактом, что при задании осей выборки мы можем использовать [[http://www.w3.org/TR/xpath#predicate предикаты]], налагающие на них ограничивающие условия: =#$one[$congcond] | $two[not($congcond)]#=.¶

== Его недостатки¶

Теперь, если отслеживать обращения xslt-процессора к файловой системе, мы можем заметить, что в первом случае были вызваны _оба_ файла из =#one/*.xml#=, тогда как во втором =#two/bar.xml#= вызван не был. Что нам и требовалось...¶

= Использование XPath 2.0 ¶
В рамках XPath 2.0 для этого существует стандартный [[http://www.w3.org/TR/xpath20/#doc-xpath-IfExpr оператор if]]. С его использованием решение задачи будет таким: =#if($congcond)then $one else $two#=. ¶

Это решение лишено _всех_ недостатков варинтов, приведенных выше, и может использоваться в любой из перечисленных ситуаций. Так что если есть возможность пользоваться XSLT 2.0 -- следует использовать именно этот вариант.¶

История предыдущих изменений

изменения дата автор
текст 2006-03-02 11:57:51 (11 лет назад) GRAy[досье]
текст, заголовок 2006-01-25 04:44:59 (11 лет назад) Eugene Efremov[досье]
RSS
Powered by POEM™ Engine Copyright © 2002-2005