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

Страница гостевой книги

Страница гостевой книги

Предположим, что мы храним (или экспортируем) данные гостевой книги в следующем формате.

Листинг 9.3. Данные гостевой книги — файл source.xml

<page>
 <date>18/08/2001</date>
 <messages>
  <message>
   <ID>1</ID>
   <POSTED>15/03/45BC</POSTED>
   <PERSON>Julius</PERSON>
   <EMAIL>caesar@hotmail.com</EMAIL>
   <SUBJECT>:(</SUBJECT>
   <MSG>Et tu, Brute...</MSG>
  </message>
  <message>
   <ID>2</ID>
   <POSTED>20/07/1969</POSTED>
   <PERSON>Neil</PERSON>
   <SUBJECT>What did I have to say? Oh, yes...</SUBJECT>
   <MSG>One small step for a man; one giant leap for mankind!</MSG>
  </message>
 </messages>
</page>

Для того чтобы вывести форму гостевой книги и сообщения, содержащиеся в source.xml, мы создадим следующее преобразование.

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

<xsl:stylesheet
 version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <!-- Формат вывода - html -->
 <xsl:output method="html"/>
 <!-- Шаблон обработки корневого узла -->
 <xsl:template match="/">
  <!-- Создаем форму гостевой книги -->
  <form method="POST" action="guestbook.xsql">
   <table>
    <tr>
     <td>Name</td>
     <td>E-mail</td>
    </tr>
    <tr>
     <td><input type="text" name="person"/></td>
     <td><input type="text" name="email"/></td>
    </tr>
    <tr>
     <td colspan="2">
      <xsl:text>Subject</xsl:text><BR/>
      <input type="text" name="subject"/><br/>
      <!-- В скрытом поле posted помещаем текущую дату -->
      <input type="hidden" name="posted" value="{page/date}"/><br/>
      <textarea rows="10" cols="50" name="msg"/><br/><br/>
      <input type="submit" value="Post"/>
     </td>
    </tr>
   </table>
  </form>
  <!-- Обрабатываем страницу -->
  <xsl:apply-templates select="page"/>
 </xsl:template>
 <!-- Обработка страницы -->
 <xsl:template match="page">
  <xsl:apply-templates select="messages"/>
 </xsl:template>
 <!-- Обработка сообщений -->
 <xsl:template match="messages">
  <xsl:apply-templates select="message"/>
 </xsl:template>
 <!-- Вывод сообщения -->
 <xsl:template match="message">
  <p>
   <xsl:text>From: </xsl:text>
   <xsl:choose>
    <!-- Если e-mail не указан, выводим просто имя -->
    <xsl:when test="not(EMAIL)">
     <xsl:value-of select="PERSON"/>
    </xsl:when>
    <!-- Если e-mail указан, выводим гиперссылку -->
    <xsl:otherwise>
     <A href="mailto:{EMAIL}"><xsl:value-of select="PERSON"/></A>
    </xsl:otherwise>
   </xsl:choose>
   <!-- Выводим дату записи -->
   <xsl:value-of select="concat(', ', POSTED)"/><br/>
   <!-- Если была указана тема, выводим ее -->
   <xsl:if test="SUBJECT">
    <xsl:text>Subject: </xsl:text>
    <xsl:value-of select="SUBJECT"/><BR/>
   </xsl:if>
   <HR/>
   <!-- Выводим текст сообщения -->
   <xsl:value-of select="MSG"/>
  </p>
 </xsl:template>
</xsl:stylesheet>

Теперь займемся самим php-скриптом.

Листинг 9.5. Скрипт guestbook.php

<html>
 <head>
  <title>Guestbook</title>
  <META
   http-equiv="Content-Type"
   content="text/html; charset=windows-1251">
  <link rel="stylesheet" type="text/css" href="style.css"/>
 </head>
 <body>
  <?php
   // Загружаем входящий документ
   $sourcefile = "source.xml";
   $sourcehandle = fopen($sourcefile, "r")
    or die("Невозможно открыть входящий документ.");
   $source = fread($sourcehandle, filesize($sourcefile));
   // Загружаем преобразование
   $stylesheetfile = "stylesheet.xsl";
   $stylesheethandle = fopen($stylesheetfile, "r")
    or die("Невозможно открыть файл преобразования");
   $stylesheet = fread($stylesheethandle, filesize($stylesheetfile));
   // Инициализируем XSLT-процессор
   $xslt = @xslt_create() or die("Can't create XSLT handle!");
   // Выполняем преобразование
   @xslt_process($stylesheet, $source, $result);
   // Выводим результат
   echo $result;
   // Освобождаем ресурсы
   @xslt_free($xslt);
  ?>
 </body>
</html>

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


Рис. 9.9. Сгенерированная из PHP-скрипта страница гостевой книги

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

Оглавление статьи/книги

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