
- •Лекция 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.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будут содержаться три сообщения.