
- •Лекция 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.20.2. Инициатива exslt
Как показывает практика, задачи, которые приходится решать при помощи расширений, как правило, совершенно стандартны, например работа с датами. Для того, чтобы избежать дублирования общих проблем, была создана так называемая инициатива EXSLT (ExtendedXSLT).
В рамках EXSLT создаются стандартные библиотеки расширений XSLT для различных процессоров. Кроме того, EXSLT активно поддерживается многими разработчиками процессоров XSLT с тем, чтобы обеспечить переносимость преобразований, использующих расширения EXSLT.
Библиотеки расширений EXSLT можно загрузить с сайта http://www.exslt.org.
На данном этапе разработанные в рамках EXSLTбиблиотеки включают в себя следующие модули:
Common– общие функции и элементы расширения (включает функцииexslt:node-setиexslt:object-typeи элементexslt:document).
Math– математические функции.
sets– функции для работы с множествами узлов (пересечение, разность и т.д.);
Functions– элементы для определения пользовательских функций;
Dates and Times– элементы и функции для работы с временными параметрами;
Strings– модуль для работы со строками;
Regular Expressions– функции для работы с регулярными выражениями.
EXSLT покрывает большинство стандартных задач расширений и, кроме того, библиотеки EXSLT могут послужить хорошим примером программирования расширений.
5.3.20.3. Средства расширения в процессореMsxml
В процессоре MSXMLопределен единственный элемент расширения верхнего уровняmsxsl:script, используемый для объявления переменных и создания пользовательских функций. Этот элемент имеет следующий синтаксис:
<msxsl:script
language = "имя-языка"
implements-prefix = "префикс-пространства-имен">
<!-- Функция языка сценариев -->
</msxsl:script>.
Атрибут languageзадает используемый язык сценариев (по умолчанию, языкJScript), а атрибутimplements-prefixзадает префикс пространства имен для создаваемых переменных или функций.
Пример использования элемента msxsl:script:
В следующем преобразовании используется пользовательская функция isImage(), которая возвращаетtrue, если в элементеfromдокументаmessage.xmlзадано два атрибута (т.е. задан атрибутimage) иfalse– в противном случае:
<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace">
<xsl:output method="text" encoding="Windows-1251"/>
<msxsl:script language="JScript"
implements-prefix="user">
function isImage(nodelist) {
attributesNumber = nodelist(0).attributes.length;
if(attributesNumber > 1)
return true;
else
return false;
}
</msxsl:script>
<xsl:template match="//header">
<xsl:apply-templates select="from"/>
</xsl:template>
<xsl:template match="from">
<xsl:text> Сообщение </xsl:text>
<xsl:number count="header"/>
<xsl:text>. От: </xsl:text>
<xsl:value-of select="@address"/>
<xsl:if test="user:isImage(.)">
<xsl:text> (с изображением)</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="text()">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>.
В результате выполнения этого преобразования в MSXMLбудет выведен следующий текст:
Сообщение 1. От: ivanov@mail.com (с изображением)
Сообщение 2. От: ivanov@mail.com.