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);
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.