| Внешние теги
В некоторых ситуациях переменные LXP требуется использовать в контексте
тегов HTML. Предположим, у вас имеется графическое изображение с динамически
изменяемой шириной. Помните, что LXP выполняет подстановку только в теrax
LXP, а в тегах HTML это сделать не удастся. Иначе говоря, ссылка на переменную
Swidth в следующем фрагменте не работает:
<1хр>
<!-- ОШИБКА: Подстановка переменных LXP во внешних
тегах невозможна -->
<img src="/images/spacer.gif" width="$width"
/>
</lxp>
Напрашивается очевидное решение — подставить тег LXP <putvar>
внутрь тега HTML. Тем не менее у такого подхода имеется существенный недостаток.
Дело в том, что такие синтаксические конструкции нарушают целостность
разметки в документе. В языках разметки правильно оформленный документ
означает недопустимость вложения тегов в содержимое других тегов, как
в следующем фрагменте:
<1хр>
<!-- Подобное вложение тегов не рекомендуется
-->
<img src=:'/irnages/spacer.gif" widtn="<putvar
name="width" />">
<lхр>
В некоторых ситуациях вложение тегов LXP во внешние теги может благополучно
работать, но делать это не рекомендуется. Возможно, требования к правильно
оформленному документу LXP в будущем станут более жесткими, поскольку
подобное вложение не только затрудняет чтение LXP, но и нарушает синтаксическую
целостность разметки.
Для решения подобных проблем в LXP был введен тег <xtag>. Этот
тег выполняет функции «оболочки» для отображения внешних тегов
(то есть тегов, не являющихся тегами LXP). У тега <xtag> имеется
один обязательный атрибут xname, который определяет тег, заменяющий <xtag>
при обработке LXP. Например, тег <xtag xname="a"> отображается
в виде тега <а>.
Необязательный атрибут xappend позволяет присоединить произвольную строку
к концу сгенерированного тега. Например, атрибут xappend=" checked"
в теге флажка HTML создает тег <input type="checkbox" checked>.
Все остальные атрибуты передаются внешнему тегу без изменений. Отчасти
именно это обстоятельство объясняет полезность тега <xtag>, поскольку
переменные, подставленные в <xtag>, автоматически подставляются
в полученный внешний тег. В качестве примера в листинге 13.31 приведен
правильный способ оформления тега HTML <1mg> в LXP.
Листинг 13.31. Подстановка во внешнем теге
с пустым блоком
<1хр>
<xtag xname-"img" src="images/spacer.gif"
width="$width" />
</lxp>
Результат выполнения этого фрагмента в документе LXP (предполагается,
что переменной width присвоено значение 10):
<1mg src="images/spacer/gif" width="10"
/>
Обратите внимание на завершающий символ / в теге <xtag>. Тег <xtag>
может быть открывающим, закрывающим пли тегом с пустым блоком в зависимости
от того, какой тег в конечном счете требуется вывести. Важнейшая особенность
этих тегов заключается в том, что LXP отслеживает все «незакрытые»
теги <xtag> и выбирает соответствующее имя тега при достижении закрывающего
тега </xtag>.
Если тег <xtag> создается для внешнего тега с пустым блоком (например,
для тега HTML <img>), вы обязаны оформить <xtag> в виде тега
с пустым блоком
и завершающим символом /. В противном случае LXP примет ближайший закрывающий
тег </xtag> за парный тег последнего открывающего тега <xtag>
(в нашем случае — <img>), что приведет к неверному сопоставлению
тегов. Рассмотрим следующий фрагмент:
<1хр>
<xtag xname="table" width="$table_w1dth">
<tr>
<-- ОШИБКА: тег с пустым блоком должен заканчиваться
символом / -->
<td><xtag xname="img" src="images/spacer.gif"
w1dth="$width"></td>
</tr>
</xtag>
</lxp>
В этом фрагменте используются три тега <xtag>. Два из них (открывающий
и закрывающий) относятся к тегу <table>, а третий (открывающий)
инкапсулирует тег <img>. Поскольку в HTML тег <img> не имеет
парного завершающего тега, этот тег <tag> должен быть тегом с пустым
блоком, но LXP не воспринимает его в этом качестве (обратите внимание
на отсутствие завершающего символа /). Проблема заключается в следующем:
LXP помнит о существовании открытого элемента <xtag> и при достижении
первого закрывающего тега </xtag> считает, что закрывается не Ter<table>,
а тег<img>.
Если переменная table_width равна 100, а неременная width равна 10,
неправильный результат будет выглядеть так:
<table width="100">
<tr>
<-- ОШИБКА: тег с пустым блоком должен заканчиваться
символом / -->
<td><img src="images/spacer.g1f" w1dth="10"></td>
</tr>
</img>
В листинге 13.32 приведена правильная комбинация тегов <xtag>.
Листинг 13.32. Использование вложенных тегов
<xtag>
<1хр>
<xtag xname="table" width="$table_width">
<tr>
<-- ПРАВИЛЬНО: тег с пустым блоком заканчивается символом
/ -->
<td><xtag xname="img" src="1mages/spacer.gif"
width="$width" /></td>
</tr>
</xtag>
</lxp>
Поскольку второй тег <xtag> в листинге 13.32 завершается символом
/, как это должно быть при инкапсуляции внешних тегов с пустым блоком,
LXP не связывает закрывающий тег с тегом <img>, и результат выглядит
так:
<table width="100">
<tr>
<-- ПРАВИЛЬНО: тег с пустым блоком заканчивается символом
/ -->
<td><img src="images/spacer.gif" width="10"
/></td>
</tr>
</table>
|