
- •Лекция 4-08
- •5.3.9. Создание текстовых узлов вXslt
- •5.3.9.1. Элементxsl:text
- •5.3.9.2. Элементxsl:value-of
- •5.3.9.3. Встроенные правила шаблона
- •1. Поздравление
- •2. Напоминание
- •5.3.9.4. Обработка пробельных символов
- •5.3.10. Создание узлов документа, комментариев, инструкций по обработке и пространства имен вXslt
- •5.3.10.1. Элемент xsl:document
- •5.3.10.2. Элементxsl:result-document
- •5.3.10.3. Элементxsl:comment
- •5.3.10.4. Элемент xsl:processing-instruction
- •5.3.10.5. Элементxsl:namespace
- •5.3.11. Копирование узлов вXslt
- •5.3.11.1. Элементxsl:copy
- •5.3.11.2. Элементxsl:copy-of
- •5.3.11.3. Элементxsl:sequence
- •5.3.12. Условная и циклическая обработка вXslt
- •5.3.12.1. Элементxsl:if
- •5.3.12.2. Элементы xsl:choose, xsl:when и xsl:otherwise
- •5.3.12.3. Элементxsl:for-each
- •5.3.12.4. Сортировка вXslt
- •5.3.13. Сообщения процессораXslt
- •5.3.14. Псевдонимы пространства имен вXslt
- •5.3.15. Нумерация вXslt
- •3. Поздравление
- •1. Поздравление
- •1. Поздравление
- •01). Поздравление
- •0:00:00:00:01)Поздравление
- •5.3.16. Форматирование чисел в xslt
- •5.3.17. Использование ключей вXslt
- •5.3.18. Переменные, параметры и функции вXslt
- •5.3.18.1. Переменные в xslt
- •5.3.18.2. Вызов именованных правил шаблона
- •5.3.18.3. Параметры в xslt
- •5.3.18.4. Функции стилей в xslt
- •5.3.19. Дополнительные функции xslt
- •5.3.19.1. Функцияdocument()
- •5.3.19.2. Функцияcurrent()
- •5.3.19.3. Функцияgenerate-id()
- •5.3.19.4. Функция system-property()
- •5.3.19.5. Функцияunparsed-entity-uri()
- •5.3.20 Использование расширений вXslt
- •5.3.20.1. Средства расширенияXslt
- •5.3.20.2. Инициатива exslt
- •5.3.20.3. Средства расширения в процессореMsxml
- •5.3.20.4. Средства расширения в процессореSaxon
5.3.9.2. Элементxsl:value-of
Элемент xsl:value-ofвыводит в выходящее дерево строковый результат вычисления выражений и имеет следующий синтаксис:.
<xsl:value-of
select="выражение"
separator="строка"
>
<!--
Содержимое: конструктор последовательности
-->
</xsl:value-of>
Необязательный атрибут selectзадает строковое значение нового текстового узла (альтернативным является задание значения нового текстового узла в конструкторе последовательности элементаxsl:value-of).
Необязательный атрибут separatorзадает символы-разделители между элементами сгенерированной последовательности при их преобразовании в результирующее строковое значение текстового узла. По умолчанию таким разделителем является одиночный пробел. Если в качестве разделителя задана пустая строка, разделителей между элементами не будет.
5.3.9.3. Встроенные правила шаблона
В спецификации определены несколько встроенных правил шаблона, которые должен реализовать любой процессор XSLT.
Первое встроенное правило шаблона позволяет рекурсивно продолжать обработку в отсутствии успешного сравнения с явным правилом шаблона в стиле. Это правило шаблона используется как для узлов элементов, так и для корневого узла и определяется следующим образом:
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>.
Для каждого метода также есть встроенное правило шаблона, позволяющее рекурсивно продолжать обработку в том же самом режиме, в отсутствии успешного сравнения с образцом из явного правила шаблона в этом стиле. Это правило шаблона применяется как для узлов элементов, так и для корневого узла. Далее приведен эквивалент встроенного правила шаблона для режима m.
<xsl:template match="*|/" mode="m">
<xsl:apply-templates mode="m"/>
</xsl:template>.
Также есть встроенное правило шаблона для текстовых узлов и узлов атрибутов, которое просто копирует текст:
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>.
Для инструкций обработки и комментариев встроенное правило шаблона не должно делать ничего:
<xsl:template match="processing-instruction()|comment()"/>
Встроенное правило шаблона для узлов пространства имен также не должно делать ничего. Нет образца, который бы мог соответствовать узлу пространства имен, поэтому встроенное правило шаблона является единственным правилом шаблона, которое применяется к узлам пространства имен.
Встроенные правила шаблона обрабатываются так, как будто они были неявно импортированы раньше стиля, а потому имеют меньший приоритет импорта, чем все остальные правила шаблона. Таким образом, автор можно переопределить встроенное правило шаблона, явно включив новое правило шаблона.
Пример использования элементов xsl:text и xsl:value-of:
Следующая таблица стилей формирует документ HTMLдля оглавления тем сообщений и самих сообщений для документаXMLmessage.xml:
<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="html"
encoding="Windows-1251"
indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>Вывод оглавления и списка сообщений</title>
</head>
<body>
<xsl:apply-templates select="//header/subject"
mode="contents"/>
<xsl:apply-templates select="message"/>
</body>
</html>
</xsl:template>
<xsl:template match="subject" mode="contents">
<xsl:text
disable-output-escaping="yes"><a href="#m</xsl:text>
<xsl:value-of select="position()"/>
<xsl:text
disable-output-escaping="yes">"></xsl:text>
<xsl:value-of select="position()"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="."/>
<xsl:text
disable-output-escaping="yes"></a></xsl:text>
<br />
</xsl:template>
<xsl:template match="header">
<br /><br />
<xsl:text
disable-output-escaping="yes"><a name=m"</xsl:text>
<xsl:value-of
select="count(preceding-sibling::header)+1"/>
<xsl:text
disable-output-escaping="yes">"><h3></xsl:text>
<xsl:text>Сообщение </xsl:text>
<xsl:value-of
select="count(preceding-sibling::header)+1"/>
<xsl:text
disable-output-escaping="yes"></h3></a></xsl:text>
<xsl:apply-templates select="from"/>
<xsl:apply-templates select="to"/>
<xsl:apply-templates select="subject"/>
</xsl:template>
<xsl:template match="from">
<p>От:
<xsl:value-of select="@address"/>
</p>
</xsl:template>
<xsl:template match="to">
<p>Кому:
<xsl:value-of select="@address"/>
</p>
</xsl:template>
<xsl:template match="subject">
<p>Тема:
<xsl:value-of select="."/>
</p>
</xsl:template>
<xsl:template match="body">
<p>Текст:
<xsl:value-of select="."/>
</p>
</xsl:template>
</xsl:stylesheet>.
В результате преобразования тело документа HTMLбудет иметь следующий вид:
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=Windows-1251">
<title>Вывод оглавления и списка сообщений</title>
</head>
<body>
<a href="#m1">1. Поздравление</a><br>
<a href="#m2">2. Напоминание</a><br>
<br /><br />
<a name="m1"><h3>Сообщение 1</h3></a>
<p>От: ivanov@mail.com</p>
<p>Кому: petrov@mail.com</p>
<p>Тема: Поздравление</p>
<p>Текст: Поздравляю с днем рождения!</p>
<br /><br />
<a name="m2"><h3>Сообщение 2</h3></a>
<p>От: ivanov@mail.com</p>
<p>Кому: sidorov@mail.com</p>
<p>Тема: Напоминание</p>
<p>Текст: Встречаемся в 10.00.</p>
</body>
</html>.
и в Web-браузере будет выведено: