Ключи, определенные в преобразовании, могут использоваться для выбора узлов в различных обрабатываемых документах. Функция
key
возвращает узлы, которые принадлежат текущему документу, то есть документу, содержащему текущий узел. Значит, для того, чтобы выбирать узлы из внешнего документа, необходимо сделать текущим узлом один из узлов этого внешнего документа. Контекстный документ может быть легко изменен элементом
xsl:for-each
, например, для того, чтобы текущим документом стал
документ
a.xml
, достаточно написать
<xsl:for-each select="document('а.xml')">
<!-- Теперь текущим документом стал документ а.xml -->
</xsl:for-each>
Пример
Предположим, что нам нужно выбрать объекты, принадлежащие источнику
a
, причем принадлежность объектов определена в двух внешних документах,
В теории реляционных баз данных существует такое понятие, как составной ключ. Согласно определению К. Дж. Дейта [Дейт 1999], составной ключ — это "потенциальный ключ; состоящий из более чем одного атрибута".
Хотя концепция ключей в XSLT сильно отличается от того, что называется ключом в реляционных БД, идея весьма и весьма интересна: использовать при обращении к множествам узлов не одно свойство, а некоторую их комбинацию.
Главная проблема состоит в том, что значение ключа в XSLT всегда является строкой, одним из самых примитивных типов. И выбирать множества узлов можно только по одному строковому значению за один раз. Ничего похожего на
key(key-name, key-value-1, key-value-2, ...)
для выбора узлов, первое свойство которых равно
key-value-1
, второе —
key-value-2
и так далее, XSLT не предоставляет.
Выход достаточно очевиден: если значение ключа не может быть сложной структурой, оно должно выражать сложную структуру. Иными словами, раз значением составного ключа может быть только строка, то эта строка должна состоять из нескольких частей.
Пример
Предположим, что объекты с одинаковыми именами могут принадлежать различным источникам. Покажем, как с помощью ключей можно решить следующие задачи:
□ найти объект с определенным именем и источником;