Книга: Технология XSLT

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

Выполнение 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 type="submit" value="Послать сообщение">
</form>

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

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

<services>
 <service>
  <action>http://www.mtnsms.com/sendsms.php</action>
  <method>GET</method>
  <text>msg</text>
  <number>num</number>
 </service>
 <service>
  <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>
  <name>Иван Иванович</name>
  <number>18005557684</number>
  <service/>
 </person>
 <person>
  <name>Иван Никифорович</name>
  <number>447856273447</number>
  <service/>
 </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"/>
   </A>
   <xsl:text>&#xA0;&#xA0;&#xA0;</xsl:text>
  </xsl:if>
 </xsl:template>
 <!-- Шаблон создания формы для выбранного адресата -->
 <xsl:template match="person" mode="form">
  <!--
   | Находим элемент, описывающий параметры службы отправки сообщений
   | текущему адресату
   +-->
  <xsl:variable name="service"
   select="document('services.xml')/services/
   service[@id = current()/service/@id]"/>
  <br/>
  <form
   action="{$service/action}" method="{$service/method}">
   <input type="hidden"
    name="{$service/number}"
    value="{number}"/>
   <textarea rows="10" cols="50"
    name="{$service/text}"/>
   <br/>
   <input type="submit" value="Послать сообщение"/>
  </form>
 </xsl:template>
 <xsl:template name="head">
  <head>
   <title>SMS Center</title>
   <link rel="stylesheet" type="text/css" href="style.css"/>
  </head>
 </xsl:template>
</xsl:stylesheet>

Теперь дело осталось за ASP-страницей, которая применяла бы преобразование stylesheet.xsl к документу source.xml и возвращала результат клиенту.

Листинг 9.12. ASP-страница, использующая XSLT-преобразования

<%@ LANGUAGE = VBScript %>
<%
 ' Загружаем входящий документ
 Dim source
 Set source = Server.CreateObject("MSXML2.FreeThreadedDOMDocument.3.0")
 source.load Server.MapPath("source.xml")
 ' Загружаем преобразование
 Dim stylesheet
 Set stylesheet =
  Server.CreateObject("MSXML2.FreeThreadedDOMDocument.3.0")
 stylesheet.load Server.MapPath("stylesheet.xsl")
 ' Создаем объект XSLTemplate для преобразования
 Dim templates
 Set templates = Server.CreateObject("MSXML2.XSLTemplate")
 templates.stylesheet = stylesheet.documentElement
 ' Создаем объект XSLT-процессора
 Dim processor
 Set processor = templates.createProcessor
 processor.input = source
 ' Присваиваем параметру id значение параметра запроса id
 ' (то, что передано в sms.asp?id=...)
 processor.addParameter "id", "" + Request.QueryString("id"), ""
 ' Выполняем преобразование
 processor.transform
 ' Возвращаем результат
 Response.Charset = "windows-1251"
 Response.Write processor.output
%>

На рис. 9.11 показаны результаты работы sms.asp для id=p1 и id=p2.


Рис. 9.11. Внешний вид страницы, возвращаемой sms.asp

При вызове страницы sms.asp или sms.asp?id=p1 форма отправки сообщений будет сгенерирована в следующем виде:

<form action="http://www.mtnsms.com/sendsms.php" method="GET">
 <input type="hidden" name="num" value="18005557684">
 <textarea rows="10" cols="50" name="msg">
 </textarea>
 <br><br>
 <input type="submit" value="Послать сообщение">
</form>

Для sms.asp?id=p2 форма будет иметь вид:

<form action="http://www.smshost.net/servlets/sms" method="POST">
 <input type="hidden" name="phone" value="447856273447">
 <textarea rows="10" cols="50" name="message">
 </textarea>
 <br><br>
 <input type="submit" value="Послать сообщение">
</form>

Оглавление книги


Генерация: 1.209. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз