соответствующее множество ключей будет определяться следующим образом:
(<item name="А".../>, 'src', 'а')
(<item name="В".../>, 'src', 'b')
(<item name="С".../>, 'src', 'а')
(<item name="D".../>, 'src', 'c')
...
(<item name="H".../>, 'src', 'a')
(<item name="I".../>, 'src', 'a')
(<item name="J".../>, 'src', 'a')
(<item name="K".../>, 'src', 'a')
Функция
key('src', 'a')
возвратит объекты с именами
A
,
C
,
H
,
I
,
J
и
K
.
То, что одни и те же узлы могут иметь разные значения одного ключа, является также очень удобным свойством. Например, два определения ключей, приведенные выше, можно дополнить третьим:
обращаться к объектам, принадлежащим источнику по умолчанию.
Использование множеств узлов в функции key
Функция
key
принимает на вход два аргумента: первым аргументом является строка, задающая имя ключа, в то время как вторым аргументом может быть объект любого типа. В том случае, если аргумент
key-value
в функции
key(key-name, key-value)
является множеством узлов, функция
key
возвратит все узлы, имеющие ключ
key-name
со значением, равным хотя бы одному из строковых значений узла множества
key-value
.
Пример
Предположим, что источники объектов будут сгруппированы следующим образом:
<sources>
<source name="a"/>
<source name="c"/>
</source>
Для того чтобы вычислить множество элементов
item
, принадлежащих любому из источников данной группы, достаточно будет воспользоваться выражением вида
key('src', sources/source/@name)
Множество узлов, выбираемое путем
sources/source/@name
, будет содержать атрибуты
name
элементов
source
. Их строковые значения будут равны
а
и
с
, значит, наше выражение возвратит множество элементов
item
, значение атрибута
source
которых равно либо
а
либо
с
.
Использование ключей в нескольких
документах
Ключи, определенные в преобразовании, могут использоваться для выбора узлов в различных обрабатываемых документах. Функция
key
возвращает узлы, которые принадлежат текущему документу, то есть документу, содержащему текущий узел. Значит, для того, чтобы выбирать узлы из внешнего документа, необходимо сделать текущим узлом один из узлов этого внешнего документа. Контекстный документ может быть легко изменен элементом
xsl:for-each
, например, для того, чтобы текущим документом стал документ
a.xml
, достаточно написать
<xsl:for-each select="document('а.xml')">
<!-- Теперь текущим документом стал документ а.xml -->
</xsl:for-each>
Пример
Предположим, что нам нужно выбрать объекты, принадлежащие источнику
a
, причем принадлежность объектов определена в двух внешних документах,
В теории реляционных баз данных существует такое понятие, как составной ключ. Согласно определению К. Дж. Дейта [Дейт 1999], составной ключ — это "потенциальный ключ; состоящий из более чем одного атрибута".