Преобразования расширяемого языка таблиц стилей (XSLT) предоставляют способ для автоматического перевода XML-данных из одной формы в другую. Целевая форма -это обычно другой XML-документ, но не обязательно; вы можете преобразовать XML практически во что угодно, просто создав таблицу стилей XSLT и обработав данные. Если вы хотите изменить результаты, вы просто меняете таблицу стилей и обрабатываете XML заново. Здесь есть дополнительное преимущество, расширяющее возможности непрограммистов, например, дизайнеров, которые могут изменять таблицу стилей и влиять на результаты.
Давайте посмотрим пример.
Поставленная задача
В данном руководстве мы возьмем XML-документ и преобразуем его в XHTML-документ, который можно отобразить как Web-страницу. Входные данные - это просто файл с рецептами(см. листинг 1).
Листинг 1. Основные данные
<recipes>
<recipe>
<name>Gush'gosh</name>
<ingredients>
<ingredient><qty>1</qty><unit>pound</unit>
<food>hamburger</food></ingredient>
<ingredient><qty>1</qty><unit>pound</unit>
<food>elbow macaroni</food></ingredient>
<ingredient><qty>2</qty><unit>cups</unit>
<food>brown sugar</food></ingredient>
<ingredient><qty>1</qty><unit>bag</unit>
<food>chopped onions</food></ingredient>
<ingredient><qty>1</qty><unit>teaspoon</unit>
<food>dried dill</food></ingredient>
</ingredients>
<instructions>
<instruction>Brown the hamburger.</instruction>
<instruction>Add onions and cook until
transparent.</instruction>
<instruction>Add brown sugar and dill.</instruction>
<instruction>Cook and drain pasta.</instruction>
<instruction>Combine meat and pasta.</instruction>
</instructions>
</recipe>
<recipe>
<name>A balanced breakfast</name>
<ingredients>
<ingredient><qty>1</qty><unit>cup</unit>
<food>cereal</food></ingredient>
<ingredient><qty>1</qty><unit>glass</unit>
<food>orange juice</food></ingredient>
<ingredient><qty>1</qty><unit>cup</unit>
<food>milk</food></ingredient>
<ingredient><qty>2</qty><unit>slices</unit>
<food>toast</food></ingredient>
</ingredients>
<instructions>
<instruction>Combine cereal and milk in
bowl.</instruction>
<instruction>Add all ingredients to table.</instruction>
</instructions>
</recipe>
</recipes>
|
Замечание редактора: Эти рецепты –приведены просто для примера, так, как их представляет себе автор. Правильный рецепт для Gush'gosh (полученный от его жены, которая и готовит это блюдо) состоит из 1 фунта (0,454 кг) рубленой говядины, 1 фунта рожков, 1/2стакана желтого сахара, 1 небольшого пакета (около 300 грамм) мелко нарезанного лука, 1 чайной ложки сушеного укропа и 1 небольшой банки томатной пасты, в которую добавляется желтый сахар.
Конечно, это очень простой пример, поэтому вы не увязнете в деталях самих данных, однако в виде XML-данных можно представить что угодно - от процесса журналирования до финансов.
Наша цель -преобразовать эти данные в XHTML-страницу, которая будет отображать рецепты по отдельности и форматировать их ингредиенты и инструкции по приготовлению (см. листинг 2).
Листинг 2. Результат
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/TR/xhtml1/strict">
<head><title>Recipe</title></head>
<body>
<h2>Gush'gosh</h2>
<h3>Ingredients:</h3>
<p> 1 pound hamburger<br/>
1 pound elbow macaroni<br/>
2 cups brown sugar<br/>
1 bag chopped onions<br/>
1 teaspoon dried dill<br/>
</p>
<h3>Directions:</h3>
<ol>
<li>Brown the hamburger.</li>
<li>Add onions and cook until transparent.</li>
<li>Add brown sugar and dill.</li>
<li>Cook and drain pasta.</li>
<li>Combine meat and pasta.</li>
</ol>
<h2>A balanced breakfast</h2>
<h3>Ingredients:</h3>
<p>
1 cup cereal<br/>
1 glass orange juice<br/>
1 cup milk<br/>
2 slices toast<br/>
</p>
<h3>Directions:</h3>
<ol>
<li>Combine cereal and milk in bowl.</li>
<li>Add all ingredients to table.</li>
</ol>
</body>
</html>
|
Вы можете отобразить этот результат в браузере, как показано на рисунке 1.
Рисунок 1. Результат, отображенный в браузере
Как уже упоминалось, конечной целью может быть любой формат, не только XHTML, и даже необязательно XML.
Давайте начнем с простых преобразований.
Простая таблица стилей
Самая простая таблица стилей - это просто XML документ, включающий XSLT-вывод (см. листинг 3).
Листинг 3. Самая простая таблица стилей
<html xsl:version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/strict">
<head>
<title>Recipe</title>
</head>
<body>
<h2><xsl:value-of
select="/recipes/recipe/name"/></h2>
<h3>Ingredients:</h3>
<p><xsl:value-of
select="/recipes/recipe/ingredients"/></p>
<h3>Directions:</h3>
<p><xsl:value-of
select="/recipes/recipe/instructions"/></p>
</body>
</html>
|
Обратите внимание на использование пространства имен xsl. Добавление этого пространства имен говорит процессору, какие элементы связаны с обработкой, а какие должны быть просто выведены. Элементы value-of говорят процессору вставить определенные данные в это место. Какие именно данные вставлять определяется содержимым атрибута select.
Атрибут select состоит из выражения XPath. Подробнее XPath будет обсуждаться в разделе Подробнее об XPath, однако здесь вы можете видеть, что доступ к элементам "название", "ингредиенты" и"инструкция по приготовлению" происходит через иерархию документа. Мы начинаем с корневого элемента, /recipes, и от него движемся вниз.
Как выполнить преобразование
Простейший способ выполнить XML-преобразование - это добавить указание на таблицу стилей вXML и отобразить его в браузере (см. листинг 4).
Листинг 4. Добавление в XML инструкции по обработке при помощи таблицы стилей
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="/basicstylesheet.xsl" version="1.0"
?>
<recipes>
<recipe>
<name>Gush'gosh</name>
...
|
Эта инструкция по обработке говорит браузеру извлечь таблицу стилей, расположенную в basicstylesheet.xsl, и использовать ее для преобразования XML-данных и вывода результатов. Если вы откроете наш XML-документ в браузере Microsoft® Internet Explorer®, то увидите результат, похожий на рисунок 2.
Рисунок 2. Извлечение таблицы стилей и преобразованиеXML-данных
Однако этоне совсем то, что мы хотели получить. Если вы выберете в браузере Вид>Просмотр HTML-кода, то увидите изначальный XML. Чтобы увидеть результат преобразования, необходимо произвести это преобразование и создать выходнойфайл. Это можно сделать через командную строку, используя Java-код со следующейкомандой (см. листинг 5):
Листинг 5. Преобразование документа через командную строку
java org.apache.xalan.xslt.Process -IN recipes.xml -XSL basicstylesheet.xsl -out
result.html
|
Если вы получите исключение ClassNotFoundException, возможно, вам нужно загрузить Apache Xalan (см. "Получить продукты и технологии" в разделе Ресурсы)и добавить включенные в него JAR-файлы в путь к классам.
Выполнив преобразование, показанное в листинге 5, вы увидите, что файл result.html содержит следующий код (см. листинг 6).
Листинг 6. Результаты
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/TR/xhtml1/strict">
<head><title>Recipe</title></head>
<body>
<h2>Gush'gosh</h2>
<h3>Ingredients:</h3>
<p>
1poundhamburger
1poundelbow macaroni
2cupsbrown sugar
1bagchopped onions
1teaspoondried dill
</p>
<h3>Directions:</h3>
<p>
Brown the hamburger.
Add onions and cook until transparent.
Add brown sugar and dill.
Cook and drain pasta.
Combine meat and pasta.
</p>
</body></html>
|
Я добавил несколько интервалов для удобства чтения, однако здесь следует отметить пару моментов. Во-первых, листинг6 отображает информацию только для одного рецепта. Во-вторых, ингредиенты слеплены вместе без каких-либо пробелов. Это тоже не тот результат, который мы хотели получить. К счастью, можно создать более точные шаблоны для отображения данных именно в той форме, в какой вы хотите.
|