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

     <th>name:</th>

     <td>

      <xsclass="underline" value-of select="attribute::name"/>

     </td>

    </tr>

    <tr>

     <th>phone:</th>

     <td><xsclass="underline" value of select="attribute::phone"/></td>

    </tr>

   </table>

  </td>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Пример 14.20. Применение таблицы стилей animals.xsl для файла animals.xml с использованием библиотеки Xalan

#include <exception>

#include <iostream> // cout

#include <xalanc/Include/PlatformDefinitions.hpp>

#include <xalanc/XalanTransformer/XalanTransformer.hpp>

#include <xalanc/XSLT/XSLTInputSource.hpp>

#include <xalanc/XSLT/XSLTResultTarget.hpp>

#include <xercesc/util/PlatformUtils.hpp>

#include "xerces_strings.hpp" // Пример 14.4

using namespace std;

using namespace xercesc;

using namespace xalanc;

// Утилита RAII, которая инициализирует парсер и освобождает ресурсы

// при выходе из области видимости

struct XalanInitializer {

 XalanInitializer() {

  XMLPlatformUtils::Initialize();

  XalanTransformer::initialize();

 }

 ~XalanInitializer() {

  XalanTransformer::terminate();

  XMLPlatformUtils::Terminate();

 }

};

int main() {

 try {

  XalanInitializer init; // Инициализировать Xalan.

  XalanTransformer xslt; // Конвертор XSLT.

  XSLTInputSource xml("animals.xml"); // Документ XML из

                                      // примера 14.1

  XSLTInputSource xsl("animals.xsl"); // Таблица стилей из

                                      // примера 14.19.

  XSLTResultTarget html("animals.html"); // Результат выполнения xslt.

  // Выполнить преобразование.

  if (xslt.transform(xml, xsl, html) != 0) {

   cout << "xml error: " << xslt.getLastError() << "\n";

  }

 } catch (const XMLException& e) {

  cout << "xml error " << toNative(e.getMessage()) << "\n";

  return EXIT_FAILURE;

 } catch (const exception& e) {

  cout << e.what() << "\n";

  return EXIT_FAILURE;

 }

}

Пример 14.21. Документ HTML, сгенерированный программой из примера 14.20

<html>

 <head>

  <МЕТА http-equiv="Content Type" content="text/html; charset=UTF-8">

  <title>Feldman Family Circus Animals</title>

 </head>

 <body>

  <h1>Feldman Family Circus Animals</h1>

  <table cellpadding="3" border="1">

   <tr>

    <th>Name</th>

    <th>Species</th>

    <th>Date of Birth</th>

    <th>Veterinarian</th>

    <th>Trainer</th>

   </tr>

   <tr>

    <td>Herby</td>

    <td>elephant</td>

    <td>1992-04-23</td>

    <td>

     <table>

      <tr><th>name:</th><td>Dr. Hal Brown</td></tr>

      <tr><th>phone:</th><td>(801)595-9627</td></tr>

     </table>

    </td>

    <td>

     <table>

      <tr><th>name:</th><td>Bob Fisk</td></tr>

      <tr><th>phone:</th><td>(801)881-2260</td></tr>

     </table>

    </td>

   </tr>

   <tr>

    <td>Sheldon</td>

    <td>parrot</td>

    <td>1998-09-30</td>

    <td>

     <table>

      <tr><th>name:</th><td>Dr. Kevin Wilson</td></tr>

      <tr><th>phone:</th><td>(801)466-6498</td></tr>

     </table>

    </td>

    <td>

     <table>

      <tr><th>name:</th><td>Eli Wendel</td></tr>

      <tr><th>phone:</th><td>(801)929-2506</td></tr>

     </table>

    </td>

   </tr>

   <tr>

    <td>Dippy</td>

    <td>penguin</td>

    <td>2001-06-08</td>

    <td>

     <table>

      <tr><th>name:</th><td>Dr. Barbara Swayne</td></tr>

      <tr><th>phone:</th><td>(801)459-7746</td></tr>

     </table>

    </td>

    <td>

     <table>

      <tr><th>name:</th><td>Ben Waxman</td></tr>

      <tr><th>phone:</th><td>(801)882-3549</td></tr>

     </table>

    </td>

   </tr>

  </table>

 </body>

</html>

Обсуждение

XSL-преобразование (стандарт XSLT) представляет собой язык преобразования документов XML в другие документы XML. XSLT является одним из элементов семейства спецификаций расширяемых языков описания таблиц стилей (Extensible Stylesheet Language — XSL), который обеспечивает базовые средства для визуального представления документов XML Однако XSLT полезен не только при форматировании; например, он используется веб-серверами при генерации HTML-документов «на лету» и такими системами генерации документов, как DocBook.

Преобразования XSLT представляются в виде документов XML, называемых таблицами стилей (stylesheets). Таблица стилей используется для обработки исходного документа и формирования выходного документа (result document). Таблица стилей состоит из набора шаблонов, которым соответствуют узлы исходного документа и которые применяются для получения фрагментов выходного документа. Шаблоны рекурсивно применяются к исходному документу, генерируя фрагменты выходного документа один за другим, пока не будет обнаружено ни одного соответствия. Условия соответствия записываются с помощью языка XPath, предназначенного для извлечения информационных строк, чисел, булевых значений и наборов узлов из документов XML.