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

ЖАНРЫ

Технология XSLT

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

Шрифт:

</xsl:template>

создаст в выходящем документе фрагмент вида:

<a><b><c><d/></c></b></a>

Если же шаблон будет определен в виде:

<xsl:template match="/">¶

□□<а xml:space="preserve">¶

□□□□<b>¶

□□□□□□<c xml:space="default">¶

□□□□□□□□<d/>¶

□□□□□□</c>¶

□□□□</b>¶

□□</a>¶

</xsl:template>

то

в выходящем фрагменте в элементах
а
и
b
пробельные символы будут сохранены, а в элементах
с
и
d
— удалены:

<а xml:space="preserve">¶

□□□□<b>¶

□□□□□□<c xml: space="default"><d/></c>¶

□□□□</b>¶

□□</а>

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

Для преобразований сохраняющее множество состоит из единственного элемента

xsl:text
, то есть единственный элемент в преобразовании, для которого пробельные текстовые узлы не будут удаляться, — это элемент
xsl:text
. Поэтому его часто используют для вывода в выходящем документе пробельных символов.

Для входящих документов сохраняющее множество состоит из имен всех элементов. То есть по умолчанию преобразования сохраняют все пробельные текстовые узлы. Для изменения сохраняющего множества элементов входящего документа используются элементы

xsl:preserve-space
и
xsl:strip-space
.

Элементы xsl:preserve-space и xsl:strip-space

Синтаксические конструкции этих элементов очень похожи:

<xsl:preserve-space

 elements="токены"/>

<xsl:strip-space

 elements="токены"/>

Элемент

xsl:preserve-space
добавляет, a
xsl:strip-space
удаляет имя элемента из сохраняющего множества входящего документа.

Пример

Предположим, нам нужно сохранять пробельные символы во всех элементах

d
и удалять их в элементах
с
. Тогда в преобразовании достаточно указать

<xsl:preserve-space elements="d"/>

<xsl:strip-space elements="c"/>

Вообще, обязательные атрибуты elements элементов

xsl:strip-space
и
xsl:preserve-space
содержат не сами имена элементов, а так называемые проверки имен. Проверка имени имеет три варианта синтаксиса.

□ Синтаксис

"*"
используется для выбора произвольных имен. Ей будут соответствовать любые имена элементов.

□ Синтаксис

"имя"
используется для выбора элементов с заданным именем. К примеру, проверке имени
"d"
будут соответствовать все элементы с именем "
d
".

□ Синтаксис

"префикс:*"
используется для выбора всех элементов в данном пространстве имен. К примеру, если в документе определен префикс пространства имен
upr
в виде атрибута
xmlns:upr="http://www.upr.com"
, проверке имени
"upr:*"
будут соответствовать все элементы пространства имен, определяемого идентификатором
"http://www.upr.com"
.

Пример

Предположим, что нам необходимо сохранить пробельные символы в элементе с именем

с
и удалить их в элементе
e
и элементах, принадлежащих пространству имен, определяемому идентификатором "
urn:d
".

Листинг 8.2. Входящий документ

<а xmlns:d="urn:d">¶

□□<d:b>¶

□□□□<c>¶

□□□□□□</e>¶

□□□□</c>¶

□□</d:b>¶

</a>

Листинг 8.3. Преобразование

<xsl:stylesheet

 version="1.0"

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

 <xsl:preserve-space elements="c"/>

 <xsl:strip-space elements="e t:*"

xmlns:t="urn:d"/>

 <xsl:template match="/">

<xsl:copy-of select="/"/>

 </xsl:template>

</xsl:stylesheet>

Листинг 8.4. Выходящий документ

<?xml version="1.0" encoding="utf-8"?><a xmlns:d="urn:d">¶

□□<d:b><c>¶

□□□□□□<e/>¶

□□□□</c></d:b>¶

</a>

Сообщения процессора

По большому счету, мы не можем контролировать процесс преобразования. Процессор может сам выбирать, как и в какой последовательности он будет выполнять те или иные шаблоны — таковы особенности декларативного программирования. Вместе с тем мы все-таки можем получить кое-какую информацию о ходе преобразования, используя механизм, называемый в XSLT сообщениями.

Элемент xsl:message

Синтаксис этого элемента дан ниже:

<xsl:message

 terminate="yes" | "no">

 <!-- Содержимое: шаблон -->

</xsl:message>

Элемент

xsl:message
указывает процессору на то, что он должен вывести сообщение, которое является результатом обработки шаблона, содержащегося в этом элементе. Механизм вывода сообщения зависит от реализации того или иного процессора и может быть различным — от вывода текста сообщения на экран до вызова внешнего модуля для обработки сообщения.

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