Електронні книги

Напрошується очевидне рішення - підставити тег LXP всередину тега HTML. Проте у такого підходу є істотний недолік. Справа в тому, що такі синтаксичні конструкції порушують цілісність розмітки в документі. У мовах розмітки правильно оформлений документ означає неприпустимість вкладення тегів в вміст інших тегів, як в наступному фрагменті:

">

У деяких ситуаціях вкладення тегів LXP в зовнішні теги може благополучно працювати, але робити це не рекомендується. Можливо, вимоги до правильно оформленим документом LXP в майбутньому стануть більш жорсткими, оскільки подібне вкладення не тільки ускладнює читання LXP, а й порушує синтаксичну цілісність розмітки.

Для вирішення подібних проблем в LXP був введений тег . Цей тег виконує функції «оболонки» для відображення зовнішніх тегів (тобто тегів, які не є тегами LXP). У тега є один обов'язковий атрибут xname, який визначає тег, який замінює при обробці LXP. Наприклад, тег відображається у вигляді тега <а>.

Необов'язковий атрибут xappend дозволяє приєднати довільну рядок до кінця згенерованого тега. Наприклад, атрибут xappend = "checked" в тезі прапорця HTML створює тег .

Всі інші атрибути передаються зовнішньому тегу без змін. Почасти саме ця обставина пояснює корисність тега , оскільки змінні, підставлені в , автоматично підставляються в отриманий зовнішній тег. Як приклад в лістингу 13.31 наведено правильний спосіб оформлення тега HTML <1mg> в LXP.

Лістинг 13.31. Підстановка в зовнішньому тезі з порожнім блоком

Результат виконання цього фрагмента в документі LXP (передбачається, що змінної width присвоєно значення 10):

<1mg src="images/spacer/gif" width="10" />

Зверніть увагу на завершальний символ / в тезі . тег може бути відкриває, закриває пли тегом з порожнім блоком в залежності від того, який тег в кінцевому рахунку потрібно вивести. Найважливіша особливість цих тегів полягає в тому, що LXP відстежує всі «незакриті» теги і вибирає відповідне ім'я тега при досягненні закриває тега .

якщо тег створюється для зовнішнього тега з порожнім блоком (наприклад, для тега HTML ), Ви зобов'язані оформити у вигляді тега з порожнім блоком

і завершальним символом /. В іншому випадку LXP прийме найближчий закриває тег за парний тег останнього відкриває тега (у нашому випадку - ), Що призведе до невірного порівнянні тегів. Розглянемо наступний фрагмент:

<-- ОШИБКА: тег с пустым блоком должен заканчиваться символом / -->

У цьому фрагменті використовуються три тега . Два з них (що відкриває і закриває) відносяться до тегу

, а третій (відкриває) інкапсулює тег . Оскільки в HTML тег не має парного завершального тега, цей тег повинен бути тегом з порожнім блоком, але LXP не сприймає його в цій якості (зверніть увагу на відсутність завершального символу /). Проблема полягає в наступному: LXP пам'ятає про існування відкритого елемента і при досягненні першого закриває тега вважає, що закриваються не Ter
, а тег.

Якщо змінна table_width дорівнює 100, а неременная width дорівнює 10, неправильний результат буде виглядати так:

<-- ОШИБКА: тег с пустым блоком должен заканчиваться символом / -->

У лістингу 13.32 приведена правильна комбінація тегів .

Лістинг 13.32. Використання вкладених тегів

<-- ПРАВИЛЬНО: тег с пустым блоком заканчивается символом / -->

Оскільки другий тег в лістингу 13.32 завершується символом /, як це повинно бути при інкапсуляції зовнішніх тегів з порожнім блоком, LXP не пов'язує закриває тег з тегом , і результат виглядає так:

<-- ПРАВИЛЬНО: тег с пустым блоком заканчивается символом / -->

Схожі статті

Copyright © 2024