Идентификатор (значение атрибута source ) | Элемент item |
---|---|
a | <item source='a' name='A'/> |
a | <item source='a' name='C'/> |
a | <item source='a' name='H'/> |
b | <item source='b' name='B'/> |
b | <item source='b' name='E'/> |
b | <item source='b' name='F'/> |
с | <item source='c' name='D'/> |
с | <item source='c' name='G'/> |
Таким образом, значение 'с'
идентифицирует объекты с именами D
и G
, а значение 'а'
— объекты с именами A
, C
и H
, причем находить соответствующие элементы в таблице по их ключевому свойству не составляет никакого труда.
Несмотря на то, что произведенные нами манипуляции чрезвычайно просты (и настолько же эффективны), процессор вряд ли в общем случае сможет сделать что-либо подобное сам, и потому очень важной является возможность явным образом выделять в XSLT-преобразованиях ключевые свойства множеств узлов.
В этом разделе мы будем рассматривать две конструкции, позволяющие манипулировать множествами узлов посредством ключей — это элемент xsl:key
, который определяет в преобразовании именованный ключ, и функция key
, которая возвращает множество узлов, идентифицирующихся заданными значениями ключей.
Элемент
Синтаксис элемента несложен:
<xsl:key
name='
match='
use='
Элемент верхнего уровня xsl:key
определяет в преобразовании ключ именем, заданным в значении атрибута name
, значением которого для каждого узла документа, соответствующего паттерну match
, будет результат вычисления выражения, заданного в атрибуте use
. Ни атрибут use
, ни атрибут match
не могут содержать переменных.
В нашем примере элементы item
идентифицируются значениями своих атрибутов source
. Для их идентификации мы можем определить ключ с именем src
следующим образом:
<xsl:key name='src' match='item' use='@source'/>
Следуя строгому определению, данному в спецификации языка, ключом называется тройка вида (
, где
— узел,
— имя и
— строковое значение ключа. Тогда элементы xsl:key
, включенные в преобразование, определяют множество всевозможных ключей обрабатываемого документа. Если этому множеству принадлежит ключ, состоящий из узла x
, имени у
и значения z
, говорят, что узел x
имеет ключ с именем у
и значением z
или что ключ у
узла x
равен z
.
Ключ src
из предыдущего примера определяет множество, которое состоит из следующих троек:
(<
(<
(<
(<
...
(<
В соответствии с нашими определениями мы можем сказать, что элемент
<item source='b' name='B'/>
имеет ключ с именем 'src'
и значением 'b'
или что ключ 'src'
элемента
<item source='a' name='H'/>
равен 'a'
.
Для того чтобы обращаться к множествам узлов по значениям их ключей, в XSLT существует функция key
, о которой мы сейчас и поговорим.
Функция