Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-08.doc
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
422.91 Кб
Скачать

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.

Соседние файлы в папке Лекции