![]() |
![]() |
![]() |
Лексический разбор тегов В процессе разбора тегов атрибуты либо читаются буквально, либо интерпретируются. По правилам, действующим во многих языках, заключенное в апострофы значение (например, name=' val ue') воспринимается буквально независимо от того, из каких символов оно состоит. С другой стороны, значения, заключенные в кавычки, интерпретируются, то есть некоторые символы в них имеют особый смысл. В LXP особый смысл имеют символы $, @ и &. Они используются соответственно при подстановке переменных, объектов и сущностей. Подстановкой называется процесс, в результате которого синтаксическое имя переменной, cookie, объекта или сущности, находящееся в произвольной символьной строке, заменяется связанным с ним значением. Подстановка переменных Особенности подстановки переменных со знаком $ в LXP (например, Smyvariable) поначалу сбивают с толку даже опытных программистов. При использовании LXP необходимо хорошо знать, в каких контекстах подставляются значения переменных (а в каких — не подставляются). Это поможет вам понять, когда можно задействовать подстановку, а когда лучше прибегнуть к другим средствам. Первое правило: переменные никогда не подставляются за пределами тегов LXP. В листинге 13.9 приведен пример неправильного включения значения переменной variable в документ LXP. Листинг 13.9. Недопустимая подстановка <1хр> Неге is my variable: Svariable <!-- Ошибка --> <1хр> А теперь предположим, что в браузере открыт адрес http://localhost/ test.lxp?setbar=foo, а файл test.lxp содержит блок LXP, приведенный в листинге 13. 10. Листинг 13.10. Правильная подстановка переменных <1хр> <setvar bar="$setbar" /> <!-- Значение setbar присваивается bar--> <putvar name="bar" /> <!-- Вывод значения bar --> <lxp> В этом блоке LXP тег <setvar> присваивает значение переменной setbar новой переменной с именем bar. Подстановка в данном случае вполне допустима, поскольку она выполняется в теге LXP. Поскольку в приведенном URL-адресе переменной setbar присваивается значение foo, это новое значение будет присвоено переменной bar. Тег <putvar> является примером второго правила подстановки в LXP. Некоторые теги (такие, как <putvar>) для выполнения своих функций должны получать имена переменных. Вспомните, что знаки $ и @ не входят в имена переменных; они всего лишь используются для подстановки значений вместо имен. На первый взгляд кажется, что тег <putvar> из листинга 13.10 должен выглядеть так: <putvar name="$bar" /> <!-- Вывод значения bar --> Однако в действительности это приведет к тому, что в значение атрибута name будет подставлено значение переменной bar. А так как переменная bar равна foo, то в конечном счете LXP попытается вывести переменную с именем foo. Чтобы определить, нужно ли использовать подстановочные символы в каждом конкретном случае, проще всего разобраться в том, что же делает тег. Если атрибут должен заменяться значением переменной, необходимо произвести подстановку с символом $. Если же в атрибуте просто задается имя переменной (как в теге <putvar>), подстановка не нужна. Если литерал $ требуется использовать в кавычках, его следует экранировать. Для этого в строку включаются два знака $ подряд (например, <setvar pri ce="$$99 . 95" />). ПРИМЕЧАНИЕ Если при подстановке переменная не найдена, LXP ищет cookie с указанным именем. Если cookie существует, вместо имени подставляется его значение. Подстановка объектных переменных Подстановка переменных, являющихся компонентами объектов, имеет очень много общего с подстановкой обычных переменных, разве что вместо знака $ используется знак @. С точки зрения синтаксиса между префиксами @ и $ существует единственное различие: с префиксом @ имя может содержать точки (.) и квадратные скобки ([ ]). Чтобы включить литерал @ в строку, экранируйте его удвоением (например, <setvar email="jlx(a(acommandprompt.com" />). Подстановка сущностей LXP автоматически преобразует все опознанные сущности в значениях атрибутов тегов LXP в их символьные прототипы. В LXP версии 0.8 распознавались пять стандартных сущностей XML:
Подстановка сущностей иногда бывает очень полезной — если апострофы и кавычки должны входить в значения атрибутов тегов LXP, вставить их без использования сущностей не удастся. Разработчики LXP рассматривали возможность поддержки экранирующих префиксов \ (как обычно делается в других языках программирования), но непосредственная работа с сущностями лучше соответствует стилю разметки и поднимает язык на более высокий уровень. В листинге 13.11 приведен пример подстановки сущности в теге LXP<include>. Листинг 13.11. Подстановка сущности <1хр> <setvar field="field_two" /> <include sql="SELECT f1eld_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 <1хр> <varparser find=..... replace="\'"> <include sql="SELECT * FROM table WHERE txtfield = '$txt'"> <field /><br /> </include> </varparser> </lxp> В листинге 13.12 тег <varparser find=..... replace="\' "> приказывает LXP заменять апострофы экранированной последовательностью \' во всех подставляемых значениях переменных. Обратите внимание: поиск с заменой производится только в подставляемых значениях. По этой причине литералы-апострофы в атрибуте sql тега <1 ncl ude> остаются без изменений; модификация относится только к значениям, подставляемым в этот атрибут (то есть значению переменной txt в листинге 13.12). Завершающий тег </varparser> возвращает LXP к обычному режиму подстановки переменных. ПРИМЕЧАНИЕ Вложение тегов <varparser> позволяет установить несколько одновременных правил поиска с заменой. |
![]() |
![]() |
![]() |