Чтение онлайн

на главную - закладки

Жанры

Технология XSLT

Валиков Алексей Н.

Шрифт:

 <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
. К счастью, в большинстве случаев такая информация имеется, и генерировать составные ключи не очень сложно.

Функция key в паттернах

Разбирая синтаксические правила построения паттернов, мы встретились с особой формой паттерна, в котором могла использоваться функция

key
. Приведем еще раз эту продукцию:

[PT3] IdKeyPattern ::= 'id' '(' Literal ')'

| 'key' '(' Literal ',' Literal ')'

Функция

key(key-name, key-value)
в паттерне будет соответствовать узлам, значение ключа
key-name
которых равняется или принадлежит объекту
key-value
. Это позволяет использовать возможности ключей при проверке узлов на соответствие образцу.

Пример

Предположим, что нам нужно по-особому обработать объекты, принадлежащие источнику

а
. Для этого мы можем создать шаблон следующего вида.

Листинг 8.30. Шаблон, использующий функцию key в паттерне

<xsl:template match="key('src', 'a')">

 <!-- Содержимое шаблона -->

</xsl:template>

Этот шаблон будет применяться к любым узлам, имеющим ключ

src
со значением
а
.

Нумерация

Нумерация, несомненно, является одной из самых естественных проблем, решаемых при помощи XSLT. Задача нумерации состоит в том, чтобы, исходя из позиции обрабатываемого узла в дереве документа, вычислить по заданным критериям его порядковый номер. В качестве примера такого рода задачи можно привести вывод номеров частей, разделов и глав книги, указание номеров элементов списка или строк таблицы.

Для вычисления порядковых номеров узлов в дереве в XSLT существует несколько способов. В простых случаях для достижения цели бывает достаточно воспользоваться одним из следующих XPath-выражений.

□ Для того чтобы получить порядковый номер текущего узла в обрабатываемом множестве, можно использовать функцию

position
. Обратим внимание, что это будет позиция узла в обрабатываемом в данный момент множестве, а не в дереве исходящего документа.

□ Функция

count(preceding-sibling::*)+1
возвращает порядковый номер текущего элемента среди других элементов его родителя, иначе говоря, среди его братьев. Путь выборки
preceding-sibling::*
выбирает множество братских элементов, предшествующих текущему узлу, а функция
count
вычисляет их количество. Таким образом, значение
count(preceding-sibling::*)+1
будет равно
1
для первого элемента (поскольку ему другие элементы не предшествуют),
2
— для второго (ему предшествует один элемент) и так далее.

Поделиться:
Популярные книги

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Изгой

Майерс Александр
2. Династия
Фантастика:
фэнтези
попаданцы
рпг
аниме
5.00
рейтинг книги
Изгой

Ветер перемен

Ланцов Михаил Алексеевич
5. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ветер перемен

Последний Герой. Том 2

Дамиров Рафаэль
2. Последний герой
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Последний Герой. Том 2

Ружемант

Лисицин Евгений
1. Ружемант
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Ружемант

Имя нам Легион. Том 15

Дорничев Дмитрий
15. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 15

Печать зверя

Кас Маркус
7. Артефактор
Фантастика:
городское фэнтези
аниме
5.00
рейтинг книги
Печать зверя

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Повелитель теней. Том 3

NikL
3. Повелитель теней
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Повелитель теней. Том 3

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Князь Барсов

Петров Максим Николаевич
1. РОС. На мягких лапах
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Князь Барсов

Мастер 4

Чащин Валерий
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Мастер 4

Газлайтер. Том 23

Володин Григорий Григорьевич
23. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 23