Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

 </xsl:template>

</xsl:stylesheet>

Обратим внимание на следующие особенности этого преобразования.

□ В нем объявлено пространство имен с префиксом

xhtml
.

□ Литеральный элемент

p
содержит объявление пространства имен с префиксом
xslt
и URI
http://www.w3.org/1999/XSL/Transform
.

□ Литеральный элемент

p
содержит атрибут,
xslt:exclude-result-prefixes
,
принадлежащий пространству имен XSLT.

Как ни странно, ни одно из этих объявлений не проникнет в выходящий документ, который будет иметь вид

4

Попробуем объяснить такой результат. Атрибут

xslt:exclude-result-prefixes
не был включен в результирующий элемент
p
, поскольку принадлежал пространству имен XSLT (отметим еще раз, что принадлежность эта определяется не префиксом, а значением
URI
). Далее, объявление пространства имен

xmlns:xslt="http://www.w3.org/1999/XSL/Transform"

которое содержалось в литеральном элементе

p
, не вошло в результат, потому что URI этого объявления совпадало с URI пространства имен XSLT. И, наконец, объявление пространства имен
xhtml
было исключено атрибутом
exclude-result-prefixes
.

Атрибуты языка XSLT в литеральных элементах

Мы упомянули о том, что литеральные элементы могут содержать атрибуты, принадлежащие пространству имен XSLT. В табл. 4.3 они перечислены вместе с краткими описаниями назначения.

Таблица 4.3. XSLT-атрибуты литеральных элементов

Атрибут Назначение
xsl:version
Указывает версию языка в случае использования упрощенного синтаксиса записи преобразований
xsl:exclude-result-prefixes
Перечисляет префиксы пространств имен, которые должны быть исключены в данном элементе
xsl:extension-element-prefixes
Перечисляет префиксы пространств имен, которые используются в элементах расширения
xsl:use-attribute-sets
Перечисляет названия именованных наборов атрибутов, которые следует включить в данный элемент на выходе

Шаблоны значений атрибутов

Во многих элементах XSLT в качестве значений атрибутов могут быть указаны специальные шаблоны, называемые шаблонами значений атрибутов (attribute value templates). Замечательное свойство этих шаблонов заключается в том, что вместо простых строковых значений в атрибутах можно использовать результаты вычисления выражений. Выражения в шаблонах значений атрибутов должны быть заключены в фигурные скобки ("

{}
"). Если процессор встретит внутри значения атрибута выражение в таких скобках, он должен будет вычислить это выражение и заменить его в атрибуте вместе с фигурными скобками на результат вычисления в строковом виде.

Пример

Довольно часто в практике программирования на XSLT встречается потребность создавать элементы с именами, которые заранее не

известны, но могут быть вычислены в ходе выполнения преобразования. Представим себе документ

<mark-up type="b">This text should be marked bold.</mark-up>

в котором атрибут

type
элемента
mark-up
указывает на тип элемента разметки, который должен быть использован для данного текстового фрагмента. Для того чтобы получить элемент вида

<b>This text should be marked bold.</b>

можно использовать следующий шаблон:

<xsl:template match="mark-up">

 <xsl:element name="{@type}">

<xsl:value-of select="."/>

 </xsl:element>

</xsl:template>

Таким образом, в качестве имени нового элемента, содержащего текст элемента

mark-up
, будет использовано значение атрибута
type
.

В одном атрибуте можно использовать несколько выражений — каждое из них должно быть заключено в фигурные скобки.

Пример

Предположим, что мы хотим вывести ссылки на графические изображения в виде иконок. Мы задаем список файлов в виде XML-документа:

<images dir="/images">

 <image filename="rose.jpg"/>

 <image filename="orchide.gif"/>

 <image filename="primul.gif"/>

</images>

Файлы хранятся в каталоге, указанном в атрибуте

dir
элемента
images
, а иконки имеют те же имена файлов, что и большие изображения, но с префиксом "
th_
". Для получения ссылок на изображения мы можем воспользоваться следующим преобразованием:

<xsl:template match="images/image">

 <а href="#">

<img src="{../@dir}/th_{@filename}"/>

 </a>

</xsl:template>

Результат будет получен в виде:

<а href="#"><img src="/images/th_rose.jpg"/></a>

<a href="#"><img src="/images/th_orchide.gif"/></a>

<a href="#"><img src="/images/th_primul.gif"/></a>

Для того чтобы использовать в значении атрибута левые и правые фигурные скобки в качестве простых символов, нужно удваивать их количество, то есть указывать "

{{
" вместо каждой левой и "
}}
" вместо каждой правой фигурной скобки соответственно.

Пример

Элемент, определенный как

<input name="login" type="text"

 value="{{{{{{Enter your login here}}}}}}"/>

будет преобразован в выходящем документе к виду

<input name="login" type="text" value="{{{Enter your login here}}}"/>

Фигурные скобки нельзя использовать рекурсивно для вычисления внутри выражений. К примеру, в качестве значения атрибута

name
, определенного как

<story name="{/h{1 + 2}/p}"/>

Поделиться с друзьями: