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

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

Жанры

Технология 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
— для второго (ему предшествует один элемент) и так далее.

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

Последнее желание

Сапковский Анджей
1. Ведьмак
Фантастика:
фэнтези
9.43
рейтинг книги
Последнее желание

Ученичество. Книга 2

Понарошку Евгений
2. Государственный маг
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ученичество. Книга 2

Адвокат Империи 7

Карелин Сергей Витальевич
7. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 7

Вонгозеро

Вагнер Яна
1. Вонгозеро
Детективы:
триллеры
9.19
рейтинг книги
Вонгозеро

Мастер 7

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

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Двойник Короля 2

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

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

И вспыхнет пламя

Коллинз Сьюзен
2. Голодные игры
Фантастика:
социально-философская фантастика
боевая фантастика
9.44
рейтинг книги
И вспыхнет пламя

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Черный Маг Императора 10

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