Самоучитель по SQL-сервер в Linux



Внешние теги

В некоторых ситуациях переменные 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>