Книга: Технология XSLT
Составные ключи
Разделы на этой странице:
Составные ключи
В теории реляционных баз данных существует такое понятие, как составной ключ. Согласно определению К. Дж. Дейта [Дейт 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"/>
<item source="b" name="F"/>
<item source="a" name="C"/>
<item source="c" name="G"/>
<item source="a" name="H"/>
<item source="a" name="B"/>
<item source="b" name="G"/>
<item source="c" name="H"/>
<item source="c" name="C"/>
<item source="c" name="D"/>
<item source="b" name="A"/>
<item source="a" name="B"/>
<item source="c" name="D"/>
<item source="c" name="E"/>
<item source="a" name="F"/>
</items>
Для элементов item
мы будем генерировать ключи, значения которых будут состоять из двух частей — источника и имени, разделенных символом "-
". Для того чтобы решить одним ключом все три поставленные задачи, мы будем использовать для его определения три элемента xsl:key
.
Листинг 8.28. Входящий документ
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="src" match="item" use="concat(@source,'-')"/>
<xsl:key name="src" match="item" use="concat('-', @name)"/>
<xsl:key name="src" match="item" use="concat(@source, '-', @name)"/>
<xsl:template match="/">
<result>
<items source="a" name="B">
<xsl:copy-of select="key('src', 'a-B')"/>
</items>
<items name="B">
<xsl:copy-of select="key('src', '-B')"/>
</items>
<items source="a">
<xsl:copy-of select="key('src', 'a-')"/>
</items>
</result>
</xsl:template>
</xsl:stylesheet>
Листинг 8.29. Выходящий документ
<result>
<items source="a" name="B">
<item source="a" name="B"/>
<item source="a" name="B"/>
</items>
<items name="B">
<item source="b" name="B"/>
<item source="a" name="B"/>
<item source="a" name="B"/>
</items>
<items source="a">
<item source="a" name="A"/>
<item source="a" name="C"/>
<item source="a" name="H"/>
<item source="a" name="B"/>
<item source="a" name="B"/>
<item source="a" name="F"/>
</items>
</result>
У приведенного здесь способа формирования ключа есть определенные ограничения: необходимо иметь априорную информацию о строковых значениях каждого из свойств, составляющих наш композитный ключ для того, чтобы корректно формировать его строковые представления. Например, если бы в приведенном выше документе имена объектов и источников могли бы содержать символ "-
", было бы непонятно, к какому объекту относится составной ключ "a-b-c
": к объекту с источником a-b
и именем с
или к объекту с источником а
и именем b-c
. К счастью, в большинстве случаев такая информация имеется, и генерировать составные ключи не очень сложно.
- От исключительной полезности к стратегическому ценообразованию
- 2.2.5. Ключи
- Как подключить ноутбук к сети Интернет
- Могу ли я изменить или отключить звуки, которые проигрываются при запуске Windows, щелчке кнопкой мыши на папке и т. д.?
- Как записать звук и включить его в звуковую схему Windows?
- Из компьютера иногда раздается резкий звук. Как его отключить?
- Меня подключили к сети. Как в нее входить?
- Как отключить сеть, не выдергивая кабель?
- На сайтах я читаю только текст и не хочу платить за картинки. Как их отключить?
- При запуске Internet Explorer загружается какая-то непонятная страница. Как ее отключить?
- При выключении не дождался конца процесса и отключил питание. Теперь при запуске компьютер начинает бесконечно обращатьс...
- Возле часов постоянно отображается значок Безопасное извлечение устройства, который предлагает отключить жесткий диск и ...