KnigaRead.com/

Алексей Валиков - Технология XSLT

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Алексей Валиков, "Технология XSLT" бесплатно, без регистрации.
Перейти на страницу:

  </a>

  <br/><xsl:text>&#xA;</xsl:text>

  <!--

   | Если категория принадлежит раскрываемой ветке,

   | обрабатываем ее подкатегории

   +-->

  <xsl:if test="count(.|$path)=count($path)">

   <xsl:apply-templates select="category">

    <!-- Увеличиваем отступ на три пробела -->

    <xsl:with-param name="indent"

     select="concat($indent,'&#xA0;&#xA0;&#xA0;')"/>

   </xsl:apply-templates>

  </xsl:if>

 </xsl:template>


</xsl:stylesheet>

Теперь осталось лишь только создать страницу, которая при помощи JavaScript и MSXML будет выполнять преобразования и выводить результат.

Для того чтобы воспользоваться возможностями MSXML, мы включим в нашу страницу два объекта:

<!-- Объект, представляющий входящий документ -->

<object

 id="source"

 width="0"

 height="0"

 classid="clsid:f5078f32-c551-11d3-89b9-0000f81fe221">

 <param name="async" value="false">

 <param name="validateOnParse" value="false">

</object>

<!-- Объект, представляющий документ преобразования -->

<object

 id="stylesheet"

 width="0"

 height="0"

 classid="clsid:f5078f32-c551-11d3-89b9-0000f81fe221">

 <param name="async" value="false">

 <param name="validateOnParse" value="false">

</object>

"Магический" код clsid:f5078f32-c551-11d3-89b9-0000f81fe221, который присутствует в тегах обоих объектов, на самом деле не что иное, как уникальный идентификатор библиотеки MSXML 3.0, которую мы и будем использовать для выполнения преобразования. Итак, код нашей HTML- страницы будет выглядеть следующим образом.

Листинг 9.8. Код HTML-страницы

<html>

 <head>

  <meta

   http-equiv="Content-Type"

   content="text/html; charset=windows-1251" />

  <style type="text/css">

   body {font-family:Tahoma,Verdana,Arial,sans-serif; font-size:14px}

   a:link {COLOR:#990000; BACKGROUND: #ffffff; TEXT-DECORATION: none}

   a:hover {BACKGROUND: #dddddd; TEXT-DECORATION: none}

   a:visited {COLOR: #990000; TEXT-DECORATION: none}

  </style>

  <script language="JavaScript">

   <!--

   // Объявляем глобальные переменные

   // Входящий документ

   var source;

   // Преобразование

   var stylesheet;

   // Результат

   var result;


   // Функция, выполняющая действия по инициализации

   function init() {

    // Инициализируем ссылку на объект входящего документа

    source = document.all['source'];

    // Загружаем входящий документ

    source.load('source.xml');

    // Инициализируем ссылку на объект преобразования

    stylesheet = document.all['stylesheet'];

    // Загружаем документ преобразования

    stylesheet.load('stylesheet.xsl');

    // Находим элемент, в который мы будем выводить

    // результат обработки

    result = document.all['result'];

   }


   // Функция, выполняющая "раскрытие"

   //определенной ветки дерева категорий.

   function expand(id) {

    // Получаем ссылку на атрибут select

    // объявления параметра current

    var attSelect = stylesheet.selectSingleNode(

     "/xsl:stylesheet/xsl:param[@name='current']/@select");

    // Изменяем значение этого атрибута. Одинарные кавычки необходимы

    // для того, чтобы новое значение воспринималось как литерал.

    attSelect.nodeValue = "'" + id + "'";

    // Выполняем преобразование

    strResult = source.transformNode(stylesheet);

    // Обновляем страницу

    result.innerHTML = strResult;

   }

   //-->

  </script>

 </head>

 <body onload="init()">

  <!-- Объект, представляющий входящий документ -->

  <object

   id="source"

   width="0"

   height="0"

   classid="clsid:f5078f32-c551-11d3-89b9-0000f81fe221">

   <param name="async" value="false">

   <param name="validateOnParse" value="false">

  </object>

  <!-- Объект, представляющий документ преобразования -->

  <object

   id="stylesheet"

   width="0"

   height="0"

   classid="clsid:f5078f32-c551-11d3-89b9-0000f81fe221">

   <param name="async" value="false">

   <param name="validateOnParse" value="false">

  </object>

  <a href="javascript:expand(' ')">Каталог</а>

  <!-- В этом элементе мы будем выводить результат -->

  <div id="result"/>

 </body>

</html>

В браузере эта страница будет выглядеть следующим образом (рис. 9.10).

Рис. 9.10. Динамический каталог на HTML с использованием JavaScript, MSXML на основе XML и XSLT

Выполнение XSLT-преобразований в VBScript/ASP

Использование MSXML на стороне сервера не сильно отличается от клиентской версии, которую мы разобрали выше. Поскольку MSXML является стандартным СОМ-объектом, его можно использовать в любом языке программирования, умеющем работать с COM. В следующем примере будет показано, как можно использовать MSXML в ASP-странице, написанной на языке VBScript. Мы напишем небольшое Web-приложение, которое позволит отправлять короткие сообщения (SMS) через разные службы, используя один интерфейс.

Почти у всех операторов мобильной связи формы для отправки сообщений более или менее стандартны, например:

<form action=" http://www.bmtelecom.ru/wap/xm.php?snd=1 " method="POST">

 <input type="hidden" name="num" value="номер телефона">

 <textarea rows="10" cols="50" name="msg">текст сообщения</textarea>

 <br><br>

 <input class="flat" type="submit" value="Послать сообщение">

</form>

При этом различаться могут адреса служб отправки сообщений, методы отправки форм и наименования полей ввода. Все это мы можем описать в отдельном документе.

Листинг 9.9. Документ, описывающий формы служб отправки сообщений — services.xml

<services>

 <service id="MTNSMS">

  <action>http://www.mtnsms.com/sendsms.php</action>

  <method>GET</method>

  <text>msg</text>

  <number>num</number>

 </service>


 <service id="SMSHost">

  <action>http://www.smshost.net/servlets/sms</action>

  <method>POST</method>

  <text>message</text>

  <number>phone</number>

 </service>

</services>

Контакт-лист после этого может быть оформлен следующим образом.

Листинг 9.10. Контакт-лист — документ source.xml

<?xml version="1.0" encoding="windows-1251"?>

<people>

 <person id="p1">

  <name>Иван Иванович</name>

  <number>18005557684</number>

  <service id="MTNSMS"/>

 </person>

 <person id="p2">

  <name>Иван Никифорович</name>

  <number>447856273447</number>

  <service id="SMSHost"/>

 </person>

</people>

Преобразование, генерирующее HTML-страницу с формой отправки можно задать как.

Листинг 9.11. Преобразование stylesheet.xsl

<?xml version="1.0" encoding="windows-1251"?>

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transfоrm">


 <xsl:output

  method="html"

  indent="yes"

  encoding="windows-1251"/>


 <!-- Параметр, указывающий выбранного адресата, по умолчанию - p1 -->

 <xsl:param name="id" select="p1"/>


 <xsl:template match="/">

  <html>

   <xsl:call-template name="head"/>

   <body>

    <xsl:apply-templates select="people"/>

   </body>

  </html>

 </xsl:template>


 <xsl:template match="people">

  <!-- Создаем список адресатов -->

  <xsl:apply-templates select="person"/>

  <!-- Создаем форму для выбранного адресата -->

  <xsl:apply-templates select="person[@id=$id]" mode="form"/>

 </xsl:template>


 <xsl:template match="person">

  <!-- Если текущий адресат выбран -->

  <xsl:if test="@id = $id">

   <!-- Выводим его имя в квадратных скобках и без гиперссылки -->

   <xsl:text>&#xA0;[&#хА0;</xsl:text>

   <xsl:value-of select="name"/>

   <xsl:text>&#xA0;]&#xA0;</xsl:text>

  </xsl:if>

  <!-- Если адресат не выбран -->

  <xsl:if test="@id != $id">

   <!-- Выводим его имя без скобок и с гиперссылкой -->

   <xsl:text>&#xA0;&#хА0;&#хА0;</xsl:text>

   <A href="sms.asp?id={@id}">

    <xsl:value-of select="name"/>

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*