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

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

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