Вход/Регистрация
Технология XSLT
вернуться

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

Шрифт:

Функция

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. Преобразование

<xsl:stylesheet

 version="1.0"

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

 <xsl:template match="/">

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

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

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

</xsl:for-each>

<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'))"/>

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

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

</xsl:for-each>

 </xsl:template>

</xsl:stylesheet>

Листинг 8.64. Документ doc.xml

<doc>doc.xml</doc>

Листинг 8.65. Документ a/doc.xml

<doc>a/doc.xml</doc>

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

<doc>doc.xml</doc>

<doc>doc.xml</doc>

<doc>a/doc.xml</doc>

<doc>a/doc.xml</doc>

<doc>doc.xml</doc>

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

Если функции

document
передаются два множества узлов, то вычисление результата можно описать примерно следующим образом:

□ каждый из узлов первого аргумента преобразуется в строковый вид;

□ для каждого из полученных значений выполняется вызов типа

document(string, node-set)
;

□ результирующие множества объединяются.

Иными словами,

document(node-set, node-set)
работает через
document(string, node-set)
точно так же, как
document(node-set)
работает через
document(string)
. Разница лишь в том, что в первом случае базовый URI будет изменен.

  • Читать дальше
  • 1
  • ...
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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