Книга: Технология XSLT

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

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

<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>

Оглавление книги


Генерация: 0.034. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз