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

5.3.18.4. Функции стилей в xslt

Элемент-объявление xsl:functionопределяет функцию стилей, которая имеет следующий синтаксис:

<xsl:function

name="имя"

as="тип"

override="yes" | "no"

>

<!--

Содержимое: элементы xsl:param,

конструктор последовательности

-->

</xsl:function>

Функция стилей может быть вызвана в любом выражении XPath документа XSLT.

Обязательный атрибут nameзадает имя функции.

Необязательный атрибут as задает тип возвращаемого функцией значения (один из типовXPath2.0). Если этот атрибут задан, полученное в функции значение преобразуется к заданному типу. Если такое преобразование невозможно, генерируется сообщение об ошибке. Если атрибутas не задан, полученное в функции значение возвращается без преобразования.

В XSLT допустимы функции с одинаковыми именами. Если функции с одинаковыми именами имеют разное количество параметров, то вызов функции выполняется по количеству заданных аргументов. Если у нескольких функций совпадают их имена и количество параметров, то преимущественный вызов функции задается с помощью необязательного атрибута override. Если значение этого атрибута равно "yes", то будет вызвана эта функция, если "no" – другая функция с тем же именем и с тем же количеством параметров.

Содержимое элемента xsl:functionсостоит из 0 и более элементовxsl:param, за которыми конструктор последовательности, определяющей значение, возвращаемое функцией.

5.3.19. Дополнительные функции xslt

Помимо рассмотренных выше функций format-numberиkey, а также унаследованных отXPathфункций, вXSLTопределены следующие функции:

  • document()– для доступа к узлам во внешнем документеXML:

  • current()– возвращает текущий узел;

  • generate-id()– возвращает строку, которая уникальным образом идентифицирует узел;

  • system-property()– возвращает значение системного свойства;

  • unparsed-entity-uri()– возвращаетURIнеанализируемой сущности;

  • function-available()– возвращаетtrue, если функция поддерживается процессоромXSLT, иначеfalse;

  • element-available()– возвращаетtrue, если элемент поддерживается процессоромXSLT, иначеfalse.

5.3.19.1. Функцияdocument()

Функция document()позволяет обращаться к внешним документам по их URIи имеет следующее описание:

набор-узловdocument(объект,базовый-набор-узлов).

Функция document()возвращает множество узлов. В простейшем случае это множество будет состоять из корневого узла внешнего документа, но функциюdocument()можно использовать в более сложных выраженияхXPath, например, в выражениях фильтрации. Так функция

<xsl:copy-of

select="document('http://www.w3.org')/html/body/a"/>

скопирует все элементы a, находящиеся в теле (/html/body) внешнего до­кумента.

URI, которые передаются функции document(), могут быть как абсолютными, так и относительными, например, вызовdocument('doc.xml')возвратит корень документаdoc.xml, находящегося в том же каталоге, что и само преобразо­вание.

Функция document()позволяет менять «точку отсчета» относительныхURI. Если в качестве второго аргумента функцииdocument()передано множество уз­лов, то относительные идентификаторы ресурсов будут отсчитываться от базо­вого адреса первого (в порядке просмотра документа) узла этого множества.

Базовым URI узла дерева является:

  • если элемент или инструкция по обработке принадлежит внешней сущно­сти, базовым URIсоответствующего узла будетURIвнешней сущности;

  • иначе базовым URIявляетсяURIдокумента;

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

Если в качестве параметра функции document()задать пустую строку:

document(''),

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

Пример использования функции document():

Добавление нового сообщения в документ XMLmessage.xml. Новое сообщение также представляет собой действительный документXMLnewmessage.xml:

<?xml version="1.0" encoding="Windows-1251"?>

<!DOCTYPE message SYSTEM "message.dtd">

<message>

<header>

<from address="sidorov@mail.com"/>

<to address="ivanov@mail.com"/>

<subject>О встрече</subject>

</header>

<body>Давай перенесем на 11.00.</body>

</message>.

Правило преобразования XSLTбудет иметь следующий вид:

<?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="/">

<xsl:text disable-output-escaping="yes">

<!DOCTYPE message SYSTEM "message.dtd">

</xsl:text>

<xsl:element name="message">

<xsl:copy-of

select="document('message.xml')/message/*"/>

<xsl:copy-of

select="document('newmessage.xml')/message/*"/>

</xsl:element>

</xsl:template>

</xsl:stylesheet>.

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

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