УСОВЕРШЕНСТВОВАНИЯ В XSLT 2.0
Один из вопросов, которые призван решить XSLT 2.0, это упрощение импорта подобного текста без разбора из других файлов.
Отключение вывода эскейп-последовательностей
При помощи можно включать в выходной документ непосредственно символы < и &, а не последовательности <
и &
. Для этого следует установить атрибут disable-output-escaping
элемента в yes («да», по умолчанию он установлен в no
, «нет»). В приведенном ниже примере я при помощи непосредственно пишу текст " " в выходной документ:
version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Planets
Результат следующий:
Planets
Разумеется, не обязательно выводить при помощи : этот элемент можно было поместить непосредственно в элемент буквального результата. Но что делать в тех случаях, когда процессор XSLT не сможет распознать нужный нам в выходном документе элемент как фактический элемент? Например, в преобразованных документах XHTML вам потребуется , но процессор XSLT сочтет, что это не хорошо сформированный XML. Как поместить этот элемент в выходные данные?
Можно попробовать поместить этот элемент в раздел , как мы увидим в главе 6, и попытаться трактовать его как простые символьные данные, но процессоры XSLT все равно заменят < на <
, а > на >
.
Правильный способ добавить в вывод элемент — использовать атрибут doctype-public
элемента , как мы увидим в главе 6, но в качестве демонстрации для этих целей здесь я отключу вывод ESC-последовательностей в элементе (хотя этот способ не рекомендован для создания элементов ). Вот как это выглядит:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets Table
The Planets Table
|
|
|
|
А вот результат:
The Planets Table
The Planets Table
.
.
.
Далее в книге будут приведены другие примеры использования , в том числе — при обсуждении символов-разделителей далее в этой главе.
Написание значений атрибутов
В XSLT есть несколько способов написать значения атрибутов в выходные документы, и наиболее мощный — это создать атрибуты с нуля при помощи элемента , как мы увидим в главе 6.
Однако можно также во многих случаях использовать шаблоны значений атрибутов, с которыми мы познакомимся в этой главе.
Предположим, например, что нам требуется преобразовать текст в таких элементах, как , и , в атрибуты элементов , преобразуя planets.xml
в следующий вид:
MASS=".0553 (Earth = 1)" NAME="Mercury"/>
MASS=".815 (Earth = 1)" NAME="Venus"/>
MASS="1 (Earth = 1)" NAME="Earth"/>
Чтобы создать преобразование, нельзя просто использовать следующее выражение, в котором я взял значения элементов , и и попытался сделать их значениями атрибутов:
"
MASS=""
DAY=""
/>
Это не будет работать, поскольку нельзя использовать < внутри значений атрибутов, как я сделал в предыдущем примере. В XSLT для этого есть несколько способов. Один из них — использовать шаблоны значений атрибутов.
Шаблоны значений атрибутов
Шаблон имени значения атрибута не имеет ничего общего с теми шаблонами, с которыми мы до сих пор работали, — то есть с шаблонами для создания правил таблицы стилей. Напротив, применение шаблона значения атрибута (attribute value template) означает лишь, что значение атрибута может быть установлено во время выполнения.
В этом случае атрибут можно установить в значение выражения XPath (более подробно эта тема изучается в главе 4), если заключить выражение в фигурные скобки. Например, чтобы установить атрибут NAME
в строковое значение элемента , дочернего элемента контекстного узла, это значение можно присвоить следующим образом: NAME={DESCRIPTION}
.
В листинге 3.5 приведен правильный код XSLT, в котором значения элементов , , и присваиваются атрибутам элемента с теми же именами.
Листинг 3.5. Работа с шаблонами значений атрибутов
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Вот как это делается; посмотрите теперь на результирующий документ, в котором значения в различных элементах были преобразованы в атрибуты:
Предположим теперь, что нам также нужно включить все единицы измерения. Каждый элемент , и содержит атрибут UNITS
, задающий единицы измерения, и можно извлечь эти значения. Контекстным узлом является элемент , поскольку шаблон установлен для выбора этого элемента, поэтому на дочерние элементы , и можно ссылаться как " MASS
", " NAME
" и " RADIUS
". Для обращения к атрибуту UNITS
этих элементов можно использовать синтаксис " MASS/@UNITS
", " NAME/@UNITS
", и " RADIUS/@UNITS
":
Читать дальше