Выбрать главу

Теперь, когда мы разобрались со всякого рода настройками, можно заняться самой программой. Типичный сценарий использования Xalan в программе можно проиллюстрировать следующим кодом.

Листинг 9.2. Типовой сценарий использования Xalan

// Инициализируем Xerces

XMLPlatformUtils::Initialize();

// Инициализируем класс XalanTransformer

XalanTransformer::initialize();

// Создаем экземпляр класса XalanTransformer

XalanTransformer theXalanTransformer;

...

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

theXalanTransformer.transform( ... );

...

// Освобождаем XalanTransformer

XalanTransformer::terminate();

// Освобождаем Xerces

XMLPlatformUtils::Terminate();

В соответствии с этим сценарием наша программа будет выглядеть следующим образом:

#include "StdAfx.h"

#include "util/PlatformUtils.hpp"

#include "XalanTransformer/XalanTransformer.hpp"

#include "strstream"

int main(int argc, const char* argv[]) {

 using std::cerr;

 // Инициализируем Xerces

 XMLPlatformUtils::Initialize();

 // Инициализируем класс XalanTransformer

 XalanTransformer::initialize();

 // Создаем экземпляр класса XalanTransformer

 XalanTransformer theXalanTransformer;

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

 int theResult = theXalanTransformer.transform("source.xml",

  "stylesheet.xsl", "document.out");

 // В случае, если произошла ошибка, выводим, информацию о ней

 if (theResult != 0) {

  cerr << "XalanError: \n" << theXalanTransformer.getLastError();

 }

 // Освобождаем XalanTransformer

 XalanTransformer::terminate();

 // Освобождаем Xerces

 XMLPlatformUtils::Terminate();

 return theResult;

}

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

Начиная с четвертых версий, PHP поставляется вместе с XSLT-процессором Sablotron, который включен в РНР в качестве расширения.

Для того чтобы использовать Sablotron в PHP-скриптах, следует выполнить следующие действия:

1. Убедиться, что файл php_sablot.dll присутствует в каталоге расширений.

2. Убедиться, что в файле php.ini присутствует строка extension=php_sablot.dll.

3. Убедиться, что библиотеки expat.dll и sablot.dll находятся в каталоге, указанном в переменной окружения PATH.

Замечание

Приведенное описание касается только использования Sablotron на платформе Windows32. На других платформах потребуется сконфигурировать РНР с флагом --with-sablot. В остальном установка совершенно аналогична.

Теперь, когда библиотека Sablotron подключена, мы сможем написать небольшую программу, которая будет выводить страницу гостевой книги.

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

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

Листинг 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

<xsclass="underline" stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <!-- Формат вывода - html -->

 <xsclass="underline" output method="html"/>

 <!-- Шаблон обработки корневого узла -->

 <xsclass="underline" template match="/">

  <!-- Создаем форму гостевой книги -->

  <form method="POST" action="guestbook.xsql">

   <table>

    <tr>

     <td>Name</td>

     <td>E-mail</td>

    </tr>

    <tr>

     <td><input class="flat" type="text" name="person"/></td>

     <td><input class="flat" type="text" name="email"/></td>

    </tr>

    <tr>

     <td colspan="2">

      <xsclass="underline" text>Subject</xsclass="underline" 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>

  <!-- Обрабатываем страницу -->

  <xsclass="underline" apply-templates select="page"/>

 </xsclass="underline" template>

 <!-- Обработка страницы -->

 <xsclass="underline" template match="page">

  <xsclass="underline" apply-templates select="messages"/>

 </xsclass="underline" template>

 <!-- Обработка сообщений -->

 <xsclass="underline" template match="messages">

  <xsclass="underline" apply-templates select="message"/>

 </xsclass="underline" template>