Например, в DTD из примера 14.11 можно было лишь потребовать, чтобы элементы veterinarian
имели ровно два атрибута, name
и phone
, значения которых состоят из символов. Напротив, схема в примере 14.16 требует, чтобы значение атрибута phone
, кроме того, соответствовало регулярному выражению \(\d{3}\)\d{3}-\d{4}
, т.е. чтобы оно имело вид (ddd)xxx-dddd
, где d
может быть любой цифрой. Аналогично обстоит дело с элементом dateOfBirth
: если в DTD можно было только потребовать, чтобы этот элемент имел текстовое значение, то схема требует, чтобы текстовое значение имело вид yyyy-mm-dd
, где yyyy
задается в диапазоне от 0001 до 9999, mm
— от 01 до 12, a dd
— от 01 до 31.
Способность накладывать эти дополнительные ограничения создает большое преимущество, поскольку позволяет часть программистской работы переложить на парсер.
Смотри также
Рецепт 14.5.
14.7. Преобразование документа XML с помощью XSLT
Проблема
Требуется преобразовать документ XML, используя таблицу стилей XSLT.
Решение
Используйте библиотеку Xalan. Во-первых, сконструируйте экземпляр конвертора XSTL xalanc::XalanTransformer
. Затем сконструируйте два экземпляра xalanc::XSLTInputSource
(один для документа, который будет преобразован, а другой для вашей таблицы стилей) и экземпляр хаlanc::XSLTResultTarget
для документа, который будет получен в результате преобразования. Наконец, вызовите метод XSLT transform()
, передавая в качестве аргументов два экземпляра XSLTInputSource
и один XSLTResultTarget
.
Например, представим, что требуется с помощью веб-браузера просматривать список животных цирка из примера 14.1. Это легко сделать с помощью XSLT В примере 14.19 приводится таблица стилей XSLT, которая на входе принимает документ XML, такой как animals.xml , и формирует документ HTML, содержащий таблицу, в каждой строке которой описывается одно животное с указанием клички, вида, даты рождения, ветеринара и дрессировщика. Пример 14.20 показывает, как можно использовать библиотеку Xalan, чтобы воспользоваться этой таблицей стилей для документа animals.xml . В примере 14.21 приводится HTML, сгенерированный программой из примера 14.20; этот HTML переформатирован для лучшего восприятия.
Пример 14.19. Таблица стилей для animals.xml
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Feldman Family Circus Animals
Name |
Species |
Date of Birth |
Veterinarian |
Trainer |
Пример 14.20. Применение таблицы стилей animals.xsl для файла animals.xml с использованием библиотеки Xalan
#include
#include // cout
#include
#include
#include
#include
#include
#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
<���МЕТА http-equiv="Content Type" content="text/html; charset=UTF-8">
Feldman Family Circus Animals
Name |
Species |
Date of Birth |
Veterinarian |
Trainer |
Herby |
elephant |
1992-04-23 |
name: |
Dr. Hal Brown |
phone: |
(801)595-9627 |
|
name: |
Bob Fisk |
phone: |
(801)881-2260 |
|
Sheldon |
parrot |
1998-09-30 |
name: |
Dr. Kevin Wilson |
phone: |
(801)466-6498 |
|
name: |
Eli Wendel |
phone: |
(801)929-2506 |
|
Dippy |
penguin |
2001-06-08 |
name: |
Dr. Barbara Swayne |
phone: |
(801)459-7746 |
|
name: |
Ben Waxman |
phone: |
(801)882-3549 |
|
Обсуждение
XSL-преобразование (стандарт XSLT) представляет собой язык преобразования документов XML в другие документы XML. XSLT является одним из элементов семейства спецификаций расширяемых языков описания таблиц стилей (Extensible Stylesheet Language — XSL), который обеспечивает базовые средства для визуального представления документов XML Однако XSLT полезен не только при форматировании; например, он используется веб-серверами при генерации HTML-документов «на лету» и такими системами генерации документов, как DocBook.
Читать дальше