
- •Лекция 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.11.2. Элементxsl:copy-of
Элемент xsl:copy-ofимеет следующий синтаксис:
<xsl:copy-of
select = "выражение"
copy-namespaces="yes" | "no"
type="имя-типа"
validation="strict" | "lax" | "preserve" | "strip"
/>
Использование элемента xsl:copy-ofполностью аналогично использованию элементаxsl:value-ofза тем исключением, чтоxsl:copy-ofпри выводе значения выражения преобразует его к строке не во всех случаях. Поведениеxsl:copy-ofзависит от того, какой тип данных возвращает выражение, заданное в обязательном атрибутеselect.
Если результат вычисления имеет булевский, числовой или строковый тип, то xsl:copy-ofвыводит его в виде текстового узла. В этом случае поведениеxsl:copy-ofне отличается от поведения элементаxsl:value-of.
Если результатом вычисления выражения является последовательность узлов, то xsl:copy-ofкопирует в выходящий документ все узлы в порядке просмотра документа вместе с их потомками.
Если результатом вычисления является узел документа, то он копируется в выходящий документ в неизмененном виде.
Атрибуты typeиvalidationв элементеxsl:copy-ofдействуют так же, как в элементеxsl:copy.
Пример использования элементов xsl:copy и xsl:copy-of:
Следующая таблица стилей формирует копию второго сообщения в документе XMLmessage.xmlс добавлением еще одного адресата сообщения (второго элементаtoв заголовке сообщения):
<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="xml"
encoding="Windows-1251"
indent="yes"
/>
<xsl:template match="text()">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="header[position()=2]">
<xsl:copy>
<xsl:copy-of select="./from"/>
<xsl:copy-of select="./to"/>
<xsl:element name="to">
<xsl:attribute name="address">ivanenko@mail.com</xsl:attribute>
</xsl:element>
<xsl:copy-of select="./subject"/>
</xsl:copy>
</xsl:template>
<xsl:template match="body[position()=2]">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>.
В результате этого преобразования выходной документ XMLбудет иметь следующий вид:
<?xml version="1.0" encoding="Windows-1251"?>
<header>
<from address="ivanov@mail.com"/>
<to address="sidorov@mail.com"/>
<to address="ivanenko@mail.com"/>
<subject>Напоминание</subject>
</header>
<body>Встречаемся в 10.00.</body>.
5.3.11.3. Элементxsl:sequence
Элемент-инструкция xsl:sequenceиспользуется в содержимом конструктора последовательности для создания последовательности узлов или атомарных значений. Этот элемент вXSLT2.0 имеет следующий синтаксис:
<xsl:sequence select ="выражение"
/>
Атрибут selectзадает выражение, результатом вычисления которого является последовательность узлов или атомарных значений.
В отличие от многих других инструкций, элемент может возвращать последовательность уже существующих узлов, а не создавать новые узлы.
5.3.12. Условная и циклическая обработка вXslt
В XSLTимеются два элемента, которые поддерживают условную обработку –xsl:ifиxsl:choose.
5.3.12.1. Элементxsl:if
Элемент xsl:ifпозволяет создавать простые условия типа «если, то» и имеет следующий синтаксис:
<xsl:if
test="выражение''
>
<!--
Содержимое: конструктор последовательности
-->
</xsl:if>
Выражение, содержащееся в обязательном атрибуте test, вычисляется и приводится к булевому типу. В том и только том случае, если выражение имеет значениеtrue, процессор выполняет шаблон, содержащийся вxsl:if.
Вследствие того, что атрибуты в XMLне могут содержать некоторые специальные символы (такие как "<" и "&"), их необходимо заменять символьными сущностями. Так, инструкция
<xsl:if test="a < b"/>
будет с точки зрения синтаксиса XML некорректным. Вместо нее следует использовать эквивалентную инструкцию
<xsl:if test="a < b"/>.
Пример использования элемента xsl:if:
Следующая таблица стилей определяет адреса e-mailотправителей электронной почты для абонентаpetrovв документеmessage.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="text"
encoding="Windows-1251"
indent="yes"
/>
<xsl:template match="text()">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="to">
<xsl:if test="starts-with(@address,'petrov')">
Почта для petrov от: <xsl:value-of select="../from/@address"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Выходной текстовый документ будет иметь следующий вид:
Почта для petrov от: ivanov@mail.com.