Условная логика
Простейший способ условной генерации данных в LXP основан на встроенной поддержке тегов условной логики. Условные теги позволяют скрывать или активизировать целые блоки посредством проверки условий для переменных и cookie. К числу основных условных тегов LXP относятся теги: <if>, <ifnot>, <ifcookie>, <ifnotcookie>, <else>, <elseif> и <elseifnot>.
Теги <if> и <ifnot> работают с переменными LXP (или компонентами объектов), тогда как теги <ifcookie> и <ifnotcooki e> работают с файлами cookie текущего домена. Иначе говоря, теги <if> и <ifcookie> обладают одинаковыми логическими функциями, различаются только проверяемые исходные данные.
Тег <else> имеет более общий характер и реализует проверку инвертированных условий для тегов, упоминавшихся выше. Теги <elseif> и <elseifnot> в действителыюсти всего лишь обеспечивают сокращенную запись для вложения тегов <if> и <ifnot> в блоки <else>.
Теги <if> и <ifnot>
Без атрибутов теги <if> и <ifnot> не выполняют никаких полезных функций. Однако с правильно указанными атрибутами они позволяют легко и быстро помечать блоки разметки и обеспечивать их отображение при определенных условиях.
Тег <if>
Тег <if> сравнивает свои атрибуты с переменными, имена которых соответствуют именам атрибутов. Если значение заданного атрибута совпадает со значением переменной, блок разметки между <if> и парным тегом </if> обрабатывается LXP. В противном случае весь блок (от <if> до </if>) полностью игнорируется вместе со всей разметкой.
В зависимости от типа логической проверки в тег <if> включается имя атрибута, пара "имя/значение" или серия таких пар.
Если указано только имя атрибута (например, <iftest>), LXP проверяет только существование каких-либо символов, присвоенных переменной с указанным именем. Если переменная содержит пустое значение (или вообще не существует), проверка завершается неудачей, а соответствующий блок исключается из обработки. Если значение найдено, блок обрабатывается обычным образом.
При наличии одной или нескольких пар атрибутов каждое значение сравнивается со значением переменной с указанным именем. Если тег содержит более одного атрибута, то для совпадения в целом должны совпадать осе частичные условия. Только в этом случае соответствующий блок будет нормально обработан.
В листинге 13.13 тег <if> проверяет существование значения переменной с именем name, а также проверяет, содержит ли переменная access значение 1.
Листинг 13.13. Использование тега <if>.
<lхр> <if name access="l"> <strong>Success!</strong><br /> A <em>name</em> is set .and <em>access</em> is set to l.<br /> </if> < /lxp>
Тег <ifnot>
Тег <ifnot> во всех отношениях противоположен тегу <if>. Например, при перечислении нескольких атрибутов блок <ifnot> обрабатывается лишь в том случае, если не выполняется ни одного из проверяемых условий.
В листинге 13.14 тег <ifnot> убеждается в том, что переменная с именем error не содержит значения, а также проверяет, что переменная access не равна 0.
Листинг 13.14. Использование тега <ifnot>.
<lхр> <ifnot error access="0"> <strong>Success!</strong><br /> An <em>error</em> is not set .and <em>access</em> is not set to 0.<br /> </ifnot> </lxp>
Примечание
В одном теге LXP не допускается определение двух атрибутов с одинаковыми именами (то есть тег <ifnot access="0" access="2"> неправилен). Следовательно, проверка двух условий для одной переменной должна производиться двумя отдельными тегами.