Лексический разбор тегов
В процессе разбора тегов атрибуты либо читаются буквально, либо интерпретируются. По правилам, действующим во многих языках, заключенное в апострофы значение (например, name=' value') воспринимается буквально независимо от того, из каких символов оно состоит. С другой стороны, значения, заключенные в кавычки, интерпретируются, то есть некоторые символы в них имеют особый смысл.
В LXP особый смысл имеют символы $, @ и &. Они используются соответственно при подстановке переменных, объектов и сущностей.
Подстановкой называется процесс, в результате которого синтаксическое имя переменной, cookie, объекта или сущности, находящееся в произвольной символьной строке, заменяется связанным с ним значением.
Подстановка переменных
Особенности подстановки переменных со знаком $ в LXP (например, Smyvariable) поначалу сбивают с толку даже опытных программистов. При использовании LXP необходимо хорошо знать, в каких контекстах подставляются значения переменных (а в каких – не подставляются). Это поможет вам понять, когда можно задействовать подстановку, а когда лучше прибегнуть к другим средствам.
Первое правило: переменные никогда не подставляются за пределами тегов LXP. В листинге 13.9 приведен пример неправильного включения значения переменной variable в документ LXP.
Листинг 13.9. Недопустимая подстановка.
<lхр> Неге is my variable: Svariable <! --Ошибка --> <lхр>
А теперь предположим, что в браузере открыт адрес http://localhost/test.lxp?setbar=foo, а файл test.lxp содержит блок LXP, приведенный в листинге 13. 10.
Листинг 13.10. Правильная подстановка переменных.
<lхр> <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 price="$$99. 95" />).
Примечание
Если при подстановке переменная не найдена, LXP ищет cookie с указанным именем. Если cookie существует, вместо имени подставляется его значение.
Подстановка объектных переменных
Подстановка переменных, являющихся компонентами объектов, имеет очень много общего с подстановкой обычных переменных, разве что вместо знака $ используется знак @. С точки зрения синтаксиса между префиксами @ и $ существует единственное различие: с префиксом @ имя может содержать точки (.) и квадратные скобки ([ ]).
Чтобы включить литерал @ в строку, экранируйте его удвоением (например, <setvar email="jlx(a(acommandprompt.com" />).