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

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

Жанры

Технология XSLT

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

Шрифт:

Вызов document(string)

В случае если функции

document
передана строка, возвращаемое множество будет состоять из корневого узла внешнего документа. URI этого документа как раз и сообщается строковым аргументом функции
document
.

Интересной особенностью является возможность передать пустую строку:

document('')

В этом случае

document
возвратит корневой узел самого преобразования. При помощи
document('')
можно получать доступ к информации, хранящейся в самом преобразовании (оно ведь тоже является ХМL-документом). К сожалению, перед обращением к документу не существует способа проверить его существование. Процессор может либо выдать ошибку, либо возвратить пустое множество.

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

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 xmlns:user="urn:user-namespace">

 <user:data>

<item>1</item>

<item>2</item>

 </user:data>

 <xsl:variable

name="data" select="document('')/xsl:stylesheet/user:data"/>

 <xsl:template match="/">

<xsl:copy-of select="$data/item"/>

 </xsl:template>

</xsl:stylesheet>

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

<item

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 xmlns:user="urn:user-namespace">1</item>

<item

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 xmlns:user="urn:user-namespace">2</item>

Вызов document(node-set)

Передавая функции

document
множество узлов, можно получить доступ к нескольким документам, URI которых являются строковыми значениями узлов множества. Это, в частности, позволяет обращаться к документам, URI которых указаны в узлах обрабатываемого документа. Например, в контексте элемента

<а href="#">...</а>

вполне корректным вызовом функции

document
будет
document (@href)
.

Выражение

@href
— здесь возвращает множество, состоящее из единственного узла атрибута. Его строковое значение (
"http://www.w3.org"
) будет использовано как URI внешнего документа. Результирующее множество узлов будет содержать единственный корневой узел документа, расположенного по адресу http://www.w3.org.

Приведем еще один пример. XPath-выражение

//a/@href
возвращает множество всех атрибутов
href
элементов
а
текущего документа. Тогда множество document(
//a/@href
) будет содержать корневые узлы всех документов, на которые ссылается посредством элементов а текущий документ.

Вызов document(string, node-set)

URI, которые передаются функции

document
, могут быть как абсолютными, так и относительными, например
document('doc.xml')
возвратит корень документа
doc.xml
, находящегося в том же каталоге, что и само преобразование.

Функция

document
позволяет менять "точку отсчета" относительных URI. Если в качестве второго аргумента функции document передано множество узлов, то относительные идентификаторы ресурсов будут отсчитываться от базового адреса первого (в порядке просмотра документа) узла этого множества.

Базовым URI узла дерева является:

□ если элемент или инструкция по обработке принадлежит внешней сущности, базовым URI соответствующего узла будет URI внешней сущности;

□ иначе базовым URI является URI документа;

□ базовым URI текстового узла, узла атрибута, комментария или пространства имен является базовый URI родительского элемента.

Поясним вышесказанное на примерах.

Конструкция

<xsl:copy-of select="document('doc.xml')"/>

копирует в выходящий документ

doc.xml
, находящийся в одном каталоге вместе с преобразованием.

Несмотря на то, что в следующем определении

xsl:for-each
меняет контекст,
document('doc.xml')
все равно возвращает корень документа
doc.xml
, находящегося в одном с преобразованием каталоге:

<xsl:for-each select="document('a/data.xml')">

 <xsl:copy-of select="document('doc.xml')"/>

</xsl:for-each>

В следующей конструкции

document('doc.xml', /)
копирует документ
a/doc.xml,
поскольку в качестве базового URI используется URI корня документа
a/data.xml
:

<xsl:for-each select="document('a/data.xml')">

 <xsl:copy-of select="document('doc.xml', /)"/>

</xsl:for-each>

Того же самого эффекта можно достичь следующим образом:

<xsl:copy-of select="document('doc.xml', document('a/data.xml'))"/>

В следующей конструкции за базовый URI опять принимается URI самого преобразования (вернее, его корневого узла):

<xsl:copy-of select="document('doc.xml', document(''))"/>

Протестируем теперь все это вместе в одном преобразовании.

Листинг 8.63. Преобразование
Поделиться:
Популярные книги

Медиум

Злобин Михаил
1. О чем молчат могилы
Фантастика:
фэнтези
7.90
рейтинг книги
Медиум

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

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Громовая поступь. Трилогия

Мазуров Дмитрий
Громовая поступь
Фантастика:
фэнтези
рпг
4.50
рейтинг книги
Громовая поступь. Трилогия

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Попаданка в деле, или Ваш любимый доктор

Марей Соня
1. Попаданка в деле, или Ваш любимый доктор
Фантастика:
фэнтези
5.50
рейтинг книги
Попаданка в деле, или Ваш любимый доктор

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

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

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Господин моих ночей (Дилогия)

Ардова Алиса
Маги Лагора
Любовные романы:
любовно-фантастические романы
6.14
рейтинг книги
Господин моих ночей (Дилогия)

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

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

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

Измена. Право на семью

Арская Арина
Любовные романы:
современные любовные романы
5.20
рейтинг книги
Измена. Право на семью

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

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

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3