Главная » XSLT » Новые возможности старых конструкций XSLT 1.0

0

Задача

В XSLT 2.0 появилось немало мелких усовершенствований, и отыскать их все сразу довольно трудно.

Решение

Многие средства XSLT 2.0 стали развитием уже имевшихся в XSLT 1.0 ко­манд и функций. И уловить различия не так просто, как в случае совсем новых средств. В этом разделе мы перечислим все такие нюансы.

xsl:apply-templates

? Атрибут mode может принимать значение #current, которое означает, что обработка должна продолжаться в текущем режиме.

?               Можно воспользоваться поддержкой последовательностей, если написать список значений, разделенных запятыми (например, xsl:apply- templates select="title, heading, para"/>, когда нужно обра­ботать сначала элементы title, потом heading и в самом конце para. В XSLT 1.0 пришлось бы написать три отдельных команды apply- templates.

В обеих версиях можно написать:

I

<xsl:apply-templates select "title | heading | para"/> но при этом не задается порядок обработки. Дочерние узлы будут обраба­тываться в том порядке, в котором находятся в документе, а не в порядке перечисления их в атрибуте select.

xsl:attribute

?               Головной болью многих программистов на XSLT 1.0 была невозможность напи­сать такую конструкцию: <xsl:attribute name=" foo" select=" 10 " />, поскольку атрибут select в этом контексте не поддерживается. Теперь это исправлено, поэтому для задания простых атрибутов следует предпо­честь такой способ, хотя синтаксис конструктора последовательности тоже сохранился.

?               Для процессоров, поддерживающих схемы, добавлены атрибуты type и validation. Атрибут type задает встроенные или определенные пользователем типы, описываемые схемой W3C. Validation говорит, как следует проверять атрибут.

xsl:call-template

?               Результат вызова шаблона может быть произвольной последовательнос­тью (например, целых чисел), а не только набором узлов.

?               Если передать (с помощью xsl:with-param) параметр, который не опре­делен в вызываемом шаблоне, возникнет ошибка.

xsl:comment

?               Как и в случае xsl:attribute, в дополнение к конструктору последова­тельности поддерживается атрибут select.

xsl:copy и xsl:copy-of

?               Определен новый атрибут copy-namespace="yes" | "no", позволяю­щий указать, следует ли копировать узлы пространств имен, принадлежа­щие копируемому элементу. По умолчанию подразумевается значение «yes», совместимое с поведением в версии 1.0.

?               Добавлен атрибут type для задания встроенных или определенных пользователем типов, описываемых схемой W3C.

?               Добавлен атрибут validation, описывающий, как следует проверять ре­зультат и надо ли сохранять существующие аннотации типа.

xsl:element

?               Для процессоров, поддерживающих схемы, добавлены атрибуты type и validation. Атрибут type задает встроенные или определенные пользователем типы, описываемые схемой W3C. Validation говорит, как следует проверять атрибут.

xsl:for-each

?               Может обрабатывать произвольные последовательности, а не только пос­ледовательности узлов:

<xsl:for-each select="(1, 2, 3, 4, 5)">

<xsl:value-of select="."/><xsl:text>)&#xa;</xsl:text> </xsl:for-each>

xsl:key

?               Атрибуты match и use теперь могут ссылаться на глобальные переменные при условии, что не существует циклических зависимостей между значе­ниями переменных и ключом:

<xsl:variable name="state" select=" ‘active’ "/>

<xsl:key name="state-key" match="employee[@state=$state]" use="@type"/>

?               Вместо атрибута use можно использовать значение, формируемое конст­руктором последовательности:

<!– определение значения ключа путем нетривиальной обработки –> <xsl:key name="sick-key" select="employee">

<xsl:apply-templates select="record[@type=’sick-day’]" mode="sick- key"/> </xsl:key>

?               Для определения того, когда два значения ключа совпадают, можно ука­зать таблицу сравнения. Состав таблиц сравнения зависит от реализации.

xsl:message

?               Значением атрибута terminate теперь может быть выражение. Это суще­ственно упрощает жизнь, когда нужно глобально изменить поведение про­граммы в случае завершения.

?               Помимо конструктора последовательности, поддерживается также атри­бут select:

<xsl:param name="terminate" select=" ‘no’ "/>

<xsl:template match="employee"> <xsl:if test="not(@type)">

<xsl:message terminate="{$terminate}"

select=" Отсутствует атрибут type для элемента employee’ "/>

<xsl:if> </xsl:template>

xslnumber

?               Добавлен атрибут select, чтобы можно было нумеровать и другие узлы, помимо контекстного.

?               Параметры форматирования расширены, так что теперь можно выводить слова типа «one», «two», «three» (на выбранном языке):

<– Выводится ‘Ten’ –> <xsl:number value="10" format="Ww"/>

<– Выводится ‘ten’ –> <xsl:number value="10" format="w"/>

<— Выводится ‘TEN’ —> <xsl:number value="10" format="W"/>

xsl:output

?               Можно назначить имя, которое будет использоваться в команде xsl:result-document. Детали см. в рецепте 6.10.

?               Поддерживается новый метод вывода XHTML.

?               Новый атрибут escape-uri-attributes определяет, нужно ли кодиро­вать атрибуты URI при выводе в формате HTML или XHTML.

?               Новый атрибут include-content-type определяет, нужно ли добав­лять в выходной документ элемент <meta>, описывающий тип и кодиров­ку содержимого.

?               Новый атрибут normalize-unicode определяет, нужно ли нормализо­вать символы Unicode. Дополнительную информацию о нормализации см. в документе http://www.w3.org/TR/2002/WD-charmod-20020430/.

?               Новый атрибут undeclare-namespaces определяет, следует ли отме­нять объявления пространств имен в XML 1.1, когда они выходят из обла­сти видимости. Объявление пространства имен отменяется директивой xmlns: pre="", где pre – некоторый префикс.

?               Новый атрибут use-character-maps позволяет задать список имен таб­лиц символов. См. рецепт 6.8.

xsl:param

?               Для задания типа параметра можно использовать атрибут as.

?               Атрибут required позволяет указать, является параметр обязательным или нет.

?               Атрибут tunnel означает, что для данного параметра поддерживается туннелирование. См. рецепт 6.6.

xsl:processing-instruction

? Поддерживается атрибут select.

xsl:strip-space

?               Атрибут elements теперь поддерживает задание имен в виде *:Name, оз­начающем, что пробелы следует исключать из всех элементов с именем Name вне зависимости от пространства имен. См. рецепт 7.1.

xsl:stylesheet

?               Новый атрибут default-validation определяет способ контроля по умол­чанию, применяемый при создании новых узлов элементов и атрибутов, когда в команде, создающей эти узлы, отсутствует атрибут validation.

?               Новый атрибут xpath-default-namespace определяет пространство имен, подразумеваемое для элементов без префиксов в выражениях XPath.

xsl:template

?               Для задания нескольких режимов в атрибуте mode можно указать значе­ние #all или список режимов.

?               Атрибут as позволяет указать тип результата.

?               Атрибут match поддерживает сопоставление по типу.

?               Атрибут match может ссылаться на глобальные переменные или параметры.

xsl:value-of

?               Новый атрибут separator позволяет разделять последовательности. См. рецепт 7.2.

?               Помимо атрибута select, поддерживается также синтаксис конструктора последовательности.

xsl:variable

?               Для задания типа переменной можно использовать атрибут as.

xsl:with-param

?               Для задания типа параметра можно использовать атрибут as.

?               Атрибут tunnel указывает, что для данного параметра поддерживается туннелирование. См. рецепт 6.6.

?               Теперь можно использовать совместно с командой xsl:apply-imports и с новой командой xsl:next-match.

current()

?               Эта функция может возвращать элементы общего вида (например, строки), а не только узлы.

?               Может использоваться совместно с образцом для ссылки на сопоставив­шийся элемент.

<!– Сопоставляется с элементами-потомками, у которых есть атрибуты, чьи

значения соответствуют локальному имени рассматриваемого в данный момент

элемента –>

<xsl:template match="*[descendant::*/@* = local-name(current())]">

document()

?               Первый аргумент может быть произвольной последовательностью URI.

Новая функция XPath doc() представляет собой упрощенную альтернати­ву функции XSLT document() .

function-available()

?               Принимает еще и второй аргумент, который задает арность (число аргу­ментов) проверяемой функции.

key()

?               Необязательный третий аргумент служит для задания документа, в кото­ром нужно производить поиск.

Это устраняет необходимость в командах xsl:for-each, единственное назначение которых – переключиться на новый документ, чтобы функцию key() можно было использовать относительно этого документа:

<!– Такой код больше не нужен –> <xsl:for-each select="doc(‘other.xml’)"> <xsl:if test="key(‘some-key’, $val)"> <!– …–> </xsl:if> </xsl:for-each>

<!– Пишите так –>

<xsl:if test="key(‘some-key’, $val, doc(‘other.xml’))">

<!– …–>

</xsl:if>

system-propertyO

?               Определено свойство xsl:product, которое возвращает название про­цессора XSLT (например, Saxon).

?               Определено свойство xsl:product-version, которое возвращает вер­сию процессора XSLT (например, 8.1).

?               Определено свойство xsl:is-schema-aware, которое возвращает yes или no в зависимости от того, поддерживает процессор схемы или нет.

?               Определено свойство xsl:supports-serialization, которое возвра­щает yes или no в зависимости от того, поддерживает процессор сериали- зацию или нет.

?               Определено свойство xsl:supports-backward-compatibility, ко­торое возвращает yes или no в зависимости от того, поддерживает про­цессор режим обратной совместимости или нет (например, атрибут version="1.0").

Обсуждение

Основным мотивом для совершенствования старых команд XSLT было добав­ление поддержки типов и согласованности. Под согласованностью понимается главным образом добавление атрибута select в тех местах, где раньше поддер­живался только конструктор последовательности, и наоборот.

Одно из странных решений, принятых создателями XSLT, состоит в том, ® что они продолжают использовать два разных названия там, где, на мой взгляд, хватило бы и одного. В частности, речь идет об атрибутах as и type. Они никогда не используются совместно, так почему бы не оста­вить только type? В контексте XSLT 1.0 такой же аргумент можно было бы привести в пользу отказа от конструкции xsl:with-param и оставления лишь xsl:param.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии