<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.

Листинг 8.22. Входящий документ

<source name='a'/>

Листинг 8.23. Документ a.xml

<items>

 <item source='a' name='A'/>

 <item source='b' name='B'/>

 <item source='a' name='C'/>

 <item source='c' name='D'/>

</items>

Листинг 8.24. Документ b.xml

<items>

 <item source='b' name='E'/>

 <item source='b' name='F'/>

 <item source='c' name='G'/>

 <item source='a' name='H'/>

</items>

Листинг 8.25. Преобразование

<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>

Листинг 8.26. Выходящий документ

<source>

 <item source='a' name='A'/>

 <item source='a' name='C'/>

 <item source='a' name='H'/>

</source>

Составные ключи

В теории реляционных баз данных существует такое понятие, как составной ключ. Согласно определению К. Дж. Дейта [Дейт 1999], составной ключ — это 'потенциальный ключ; состоящий из более чем одного атрибута'.

Хотя концепция ключей в XSLT сильно отличается от того, что называется ключом в реляционных БД, идея весьма и весьма интересна: использовать при обращении к множествам узлов не одно свойство, а некоторую их комбинацию.

Главная проблема состоит в том, что значение ключа в XSLT всегда является строкой, одним из самых примитивных типов. И выбирать множества узлов можно только по одному строковому значению за один раз. Ничего похожего на key(key-name, key-value- 1, key-value-2, ...) для выбора узлов, первое свойство которых равно key-value-1, второе — key-value- 2 и так далее, XSLT не предоставляет.

Выход достаточно очевиден: если значение ключа не может быть сложной структурой, оно должно выражать сложную структуру. Иными словами, раз значением составного ключа может быть только строка, то эта строка должна состоять из нескольких частей.

Пример

Предположим, что объекты с одинаковыми именами могут принадлежать различным источникам. Покажем, как с помощью ключей можно решить следующие задачи:

□ найти объект с определенным именем и источником;

□ найти объекты с определенным именем;

□ найти объекты с определенным источником.

Листинг 8.27. Входящий документ

<items>

 <item source='a' name='A'/>

 <item source='b' name='B'/>

 <item source='b' name='E'/>

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату