Лексический разбор тегов
Подстановка сущностей
LXP автоматически преобразует все опознанные сущности в значениях атрибутов тегов LXP в их символьные прототипы. В LXP версии 0.8 распознавались пять стандартных сущностей XML:
- амперсанд (&);
- знак "меньше" (<);
- знак "больше" (>);
- апостроф (');
- кавычка (").
Подстановка сущностей иногда бывает очень полезной – если апострофы и кавычки должны входить в значения атрибутов тегов LXP, вставить их без использования сущностей не удастся. Разработчики LXP рассматривали возможность поддержки экранирующих префиксов \ (как обычно делается в других языках программирования), но непосредственная работа с сущностями лучше соответствует стилю разметки и поднимает язык на более высокий уровень.
В листинге 13.11 приведен пример подстановки сущности в теге LXP<include>.
Листинг 13.11. Подстановка сущности.
<lхр> <setvar field="field_two" /> <include sql="SELECT field_one. Ifield FROM ":CAPITALIZED_TABLE"" method="SQL"> <strong>Column One:</strong> <field name="field_one" /><br> <strong>Column Two:</strong> <field name="field_two" /><br> </include> </lxp>
В листинге 13.11 сущности используются в запросе SQL для того, чтобы указать в кавычках символы кавычек (). Это часто бывает необходимо для того, чтобы в PostgreSQL учитывался регистр символов, поскольку в противном случае идентификаторы автоматически преобразуются к нижнему регистру.
В процессе разбора комбинация Squot: заменяется своим символьным прототипом, в результате чего будет выполнен следующий запрос:
SELECT field_one .field_two FROM "CAPITALIZEDJABLE"
Смысл блока LXP, приведенного в этом примере, описан в подразделе "Включение данных SQL" раздела "Включение данных".
Тег <varparser>
В LXP предусмотрен простой механизм поиска и замены значений переменных, для этой цели используется тег <varparser>. Тег получает два атрибута, find и replасе. Он открывает блок, в котором все подставляемые значения переменных проходят фильтрацию но заданному правилу.
Тег <varparser> чаще всего используется для удаления или экранирования нежелательных символов. Например, при подготовке команды SQL все апострофы (') обычно экранируются символом \, поскольку в PostgrcSQL апостроф задействуется в качестве ограничителя строковых констант. В листинге 13.12 продемонстрировано экранирование апострофов в переменной с именем txt.
Листинг 13.12. Использование тега <varparser> при подготовке команды SQL.
<lхр> <varparser find=…. .replace="\'"> <include sql="SELECT * FROM table WHERE txtfield = '$txt'"> <field /><br /> </include> </varparser> </lxp>
В листинге 13.12 тег <varparser find=…. .replace="\' "> приказывает LXP заменять апострофы экранированной последовательностью \' во всех подставляемых значениях переменных.
Обратите внимание: поиск с заменой производится только в подставляемых значениях. По этой причине литералы-апострофы в атрибуте sql тега <include> остаются без изменений; модификация относится только к значениям, подставляемым в этот атрибут (то есть значению переменной txt в листинге 13.12).
Завершающий тег </varparser> возвращает LXP к обычному режиму подстановки переменных.
Примечание
Вложение тегов <varparser> позволяет установить несколько одновременных правил поиска с заменой.