<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
, причем принадлежность объектов определена в двух внешних документах, a.xml
и b.xml
.
<source name='a'/>
<items>
<item source='a' name='A'/>
<item source='b' name='B'/>
<item source='a' name='C'/>
<item source='c' name='D'/>
</items>
<items>
<item source='b' name='E'/>
<item source='b' name='F'/>
<item source='c' name='G'/>
<item source='a' name='H'/>
</items>
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:key name='src' match='item' use='@source'/>
<xsl:template match='source'>
<xsl:variable name='name' select='@name'/>
<xsl:copy>
<xsl:for-each select='document('a.xml')|document('b.xml')'>
<xsl:copy-of select='key('src', $name)'/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<source>
<item source='a' name='A'/>
<item source='a' name='C'/>
<item source='a' name='H'/>
</source>
Составные ключи
В теории реляционных баз данных существует такое понятие, как составной ключ. Согласно определению К. Дж. Дейта [Дейт 1999], составной ключ — это '
Хотя концепция ключей в XSLT сильно отличается от того, что называется ключом в реляционных БД, идея весьма и весьма интересна: использовать при обращении к множествам узлов не
Главная проблема состоит в том, что значение ключа в XSLT всегда является строкой, одним из самых примитивных типов. И выбирать множества узлов можно только по одному строковому значению за один раз. Ничего похожего на key(
для выбора узлов, первое свойство которых равно
, второе —
и так далее, XSLT не предоставляет.
Выход достаточно очевиден: если значение ключа не может
Предположим, что объекты с одинаковыми именами могут принадлежать различным источникам. Покажем, как с помощью ключей можно решить следующие задачи:
□ найти объект с определенным именем и источником;
□ найти объекты с определенным именем;
□ найти объекты с определенным источником.
<items>
<item source='a' name='A'/>
<item source='b' name='B'/>
<item source='b' name='E'/>