![]() |
![]() |
Внешние теги В некоторых ситуациях переменные 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> |
![]() |
![]() |