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);


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

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


Java 7

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


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


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

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


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.