<xsclass="underline" stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/XHTML">
<xsclass="underline" template match="/">
<p
xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
xslt:exclude-result-prefixes="xhtml">
<xslt:value-of select="2 * 2"/>
</p>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Обратим внимание на следующие особенности этого преобразования.
□ В нем объявлено пространство имен с префиксом xhtml.
□ Литеральный элемент p содержит объявление пространства имен с префиксом xslt и URI http://www.w3.org/1999/XSL/Transform.
□ Литеральный элемент p содержит атрибут, xslt:exclude-result-prefixes, принадлежащий пространству имен XSLT.
Как ни странно, ни одно из этих объявлений не проникнет в выходящий документ, который будет иметь вид
<p>4</p>
Попробуем объяснить такой результат. Атрибут 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-атрибуты литеральных элементов
| Атрибут | Назначение |
|---|---|
xsclass="underline" version |
Указывает версию языка в случае использования упрощенного синтаксиса записи преобразований |
xsclass="underline" exclude-result-prefixes |
Перечисляет префиксы пространств имен, которые должны быть исключены в данном элементе |
xsclass="underline" extension-element-prefixes |
Перечисляет префиксы пространств имен, которые используются в элементах расширения |
xsclass="underline" 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>
можно использовать следующий шаблон:
<xsclass="underline" template match="mark-up">
<xsclass="underline" element name="{@type}">
<xsclass="underline" value-of select="."/>
</xsclass="underline" element>
</xsclass="underline" template>
Таким образом, в качестве имени нового элемента, содержащего текст элемента mark-up, будет использовано значение атрибута type.
В одном атрибуте можно использовать несколько выражений — каждое из них должно быть заключено в фигурные скобки.
Предположим, что мы хотим вывести ссылки на графические изображения в виде иконок. Мы задаем список файлов в виде XML-документа:
<images dir="/images">
<image filename="rose.jpg"/>
<image filename="orchide.gif"/>
<image filename="primul.gif"/>
</images>
Файлы хранятся в каталоге, указанном в атрибуте dir элемента images, а иконки имеют те же имена файлов, что и большие изображения, но с префиксом "th_". Для получения ссылок на изображения мы можем воспользоваться следующим преобразованием:
<xsclass="underline" template match="images/image">
<а href="{../@dir}/{@filename}">
<img src="{../@dir}/th_{@filename}"/>
</a>
</xsclass="underline" template>
Результат будет получен в виде:
<а href="/images/rose.jpg"><img src="/images/th_rose.jpg"/></a>
<a href="/images/orchide.gif"><img src="/images/th_orchide.gif"/></a>
<a href="/images/primul. gif"><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}"/>
не будет использовано вычисленное значение выражения /h3/p. Вместо этого процессор выдаст ошибку.
Фигурные скобки могут быть спокойно использованы внутри выражения в литералах — в этом случае они не будут задавать значений атрибутов.
Элемент, определенный как
<page numbers="{concat ('{', ' 1,2,3', '}') }"/>
будет преобразован к виду
<page numbers="{1,2,3}"/>
Шаблоны значений могут быть использованы далеко не везде. К примеру, не могут содержать шаблонов следующие типы атрибутов.