C++. Сборник рецептов - [196]

Шрифт
Интервал

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

Таблица стилей представленная в примере 14.19, состоит из трех шаблонов. В главном шаблоне атрибут >match равен >/, т.е. он соответствует корню исходною документа, а именно узлу, который является родительским узлом по отношению к корневому элементу документа и любым инструкциям обработки и комментариям верхнего уровня. При применении этого шаблона генерируется фрагмент документа HTML, содержащий заголовок «Животные цирка Feldman Family Circus» и таблицу с одной строкой, состоящей из пяти элементов >th с метками >Name, >Species, >Date of Birth, >Veterinarian и >trainer. Этот шаблон содержит элемент >apply-templates, которому соответствует атрибут >animal. Это приводит к тому, что второй шаблон таблицы стилей с атрибутом соответствия >animal — будет применяться один раз к каждому элементу >animal, дочернему по отношению к корневому документу, формируя строку таблицы для каждого дочернего элемента. Строка, сгенерированная для элемента >animal, состоит из пяти элементов >td. Первые три элемента >td содержат текстовое значение дочерних элементов >animal (>name, >species и >dateOfBirth), извлекаемое с помощью инструкции XSLT >value-of. Последние два элемента >td содержат элементы таблицы, полученные путем применения третьего шаблона таблицы стилей с атрибутом соответствия >veterinarian|trainer, применяемого к дочерним элементам животного >veterinarian и >trainer.

Хотя в примере 14.20 мною указаны локальные файлы для таблицы стилей, исходного документа и выходного документа, >XSLTInputSources и >XSLTResultTargets могут быть сконструированы из потоков стандартной библиотеки C++, позволяя >XalanTransformer принимать поток ввода и генерировать результат в произвольном месте. Более того, вместо получения на входе экземпляров >XSLTInputSource конвертор >XalanTransformer может работать с предварительно скомпилированной таблицей стилей, представляющей экземпляр >xalanc::XalanCompiledStylesheet, и с исходным документом, прошедшим обработку парсером и представленным экземпляром >xalanc::XalanParsedSource. Это проиллюстрировано в примере 14.22. Если требуется применять одну таблицу стилей к нескольким исходным документам, гораздо более эффективный результат получается при использовании >XalanCompiledStylesheet, чем >XSLTInputSource.

Пример 14.22. Выполнение преобразования XSLT с применением предварительно откомпилированной таблицы стилей

>/*

> * те же операторы #include, которые использовались в примере 14.20

> */


>using namespace std;

>using namespace xercesc;

>using namespace xalanc;


>/*

> * Определить XalanInitializer так же, как в примере 14.20

> */

>int main() {

> try {

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

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

>  XSLTResultTarget html("animals.html"); // Результат работы xslt.

>  // Выполнить синтаксический анализ исходного документа

>  XSLTInputSource xml("animals.xml");

>  XalanParsedSource* parsedXml = 0;

>  if (xslt.parseSource(xml, parsedXml) != 0) {

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

>  }

>  // Компилировать таблицу стилей.

>  XSLTInputSource xsl("animals.xsl");

>  XalanCompiledStylesheet* compiledXsl = 0;

>  if (xslt.compileStylesheet(xsl, compiledXsl) != 0) {

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

>  }

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

>  if (xslt.transform(xml, xsl, html)) {

>   cout << "xml error: " << xslt.getLastFrror() << "\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.8.

14.8. Вычисление XPath-выражения

Проблема

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

Решение

Используйте библиотеку Xalan. Во-первых, выполните синтаксический анализ документа XML и получите указатель на >xalanc::XalanDocument. Это можно сделать, используя экземпляры >XalanSourceTreeInit, >XalanSourceTreeDOMSupport и >XalanSourceTreeParserLiaison, каждый из которых следующим образом определяется в пространстве имен >xalanc.

>#include

>#include

>#include

>#include

>...


>int main() {

> ...

> // Инициализировать подсистему XalanSourceTree

> XalarSourceTreeInit init;

> XalanSourceTreeDOMSupport support;

> // Интерфейс доступа к парсеру

> XalanSourceTreeParserLiaison liaison(support);

> // Подключить DOMSupport к ParserLiaison

> support.setParserLiaison(&liaison);


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.