
- •Лекция 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.17. Использование ключей вXslt
Ключи дают возможность работать с документами, имеющими неявную структуру перекрестных ссылок. В XML атрибуты типа ID,IDREFиIDREFSсоздают механизм, позволяющий делать в документах XML перекрестные ссылки явными. В XSLT этот механизм реализуется с помощью функцииidиз XPath. Однако этот механизм имеет ряд ограничений:
тип атрибута IDдолжен быть объявлен в DTD (поэтому, если это объявление сделано во внешнем DTD, то и распознаваться тип атрибута будет только тогда, когда процессор XML прочтет этот внешний набор DTD);
документ может иметь только один набор уникальных ID, т.е. не может быть несколько независимых наборов уникальных атрибутовID;
идентификатор элемента может быть задан лишь в атрибуте, т.е. не может быть задан ни содержимым элемента, ни элементом, являющимся непосредственным потомком;
значение атрибута должно быть именем XML (например, он не может содержать пробелов);
элемент может содержать не более одного идентификатора;
любой конкретный идентификатор может принадлежать только одному элементу.
Из-за этих ограничений документы XML иногда имеют структуру перекрестных ссылок, которая не была явно декларирована атрибутами ID/IDREF/IDREFS.
Для решения этой проблемы в XSLTвведено понятиеключа. Работа с ключами обеспечивается с помощью элемента верхнего уровняxsl:key, который определяет в преобразовании именованный ключ, и функцииkey, которая возвращает множество узлов, идентифицирующихся заданными значениями ключей.
Элемент имеет xsl:key следующий синтаксис:
<xsl:key
name="имя"
match="образец"
use="выражение"
collation="URI"
/>
Элемент xsl:keyопределяет в преобразовании ключ именем, заданным в значении атрибутаname. Каждое имя ключа можно рассматривать как отдельное, независимое пространство идентификаторов.
Значением ключа для каждого узла документа, соответствующего образцу match, будет результат вычисления выражения, заданного в атрибутеuse(для каждого узла, соответствующего шаблону, это выражение вычисляется отдельно). Значением ключа может быть произвольная строка и это не обязательно должно быть имя (в частности значением ключа для атрибутовmatch="from"иuse="@*"значением ключа будут значения всех атрибутов элементаfrom).
Ни атрибут use, ни атрибутmatchне могут содержать переменных.
Атрибут collationзадает ссылку на ресурс, содержащий правила сравнения строк.
В документе может быть несколько ключей, относящихся к одному и тому же узлу и имеющих одно и то же название, но с различными значениями ключа.
В документе может быть несколько ключей, имеющих одно и то же название ключа, одно и то же значение, но относящихся к различным узлам.
Для обращения в правилах шаблона к множествам узлов по значениям их ключей, в XSLTиспользуется функцияkey, имеющая следующий вид:
набор-узловkey(строка,объект).
Функция помещает в возвращаемый набор-узловвсе узлы, для которых значение их ключа с именемстрока(определенного в элементеxsl:key) равно значениюобъекта.
Пример использования ключей:
Вывести таблицу отправителей сообщений в message.xml, отправителем для которых является абонентsidorov@mail.com. Преобразование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="html"
encoding="Windows-1251" indent="yes"/>
<xsl:key name="to-list" match="to" use="@address" />
<xsl:template match="/">
<html>
<head>
<title>Использование ключей</title>
</head>
<body>
<h4>
Отправители сообщений для sidorov@mail.com:
</h4>
<table border="2">
<tr>
<th>Номер сообщения</th>
<th>Отправитель</th>
</tr>
<xsl:for-each
select="key('to-list', 'sidorov@mail.com')">
<tr>
<td align="center">
<xsl:number count="header"/>
</td>
<td>
<xsl:value-of
select="preceding-sibling::from/@address"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
В результате выполнения этого преобразования будет выведена следующая таблица:
Отправители сообщений для sidorov@mail.com:
Номер сообщения |
Отправитель |
2 |
ivanov@mail.com |