<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 будет изменен.

Другие дополнительные функции XSLT

Функция current

Выражение для этой функции имеет вид:

node-set current()

Функция current возвращает множество, состоящее из текущего узла преобразования.

Мы часто использовали термины текущий узел и узел контекста как синонимы: действительно, в большинстве случаев между ними нет никакой разницы, текущий узел преобразования совпадает с узлом контекста вычисления выражений. Однако бывают ситуации, когда они являются двумя различными узлами.

Представим себе, что нам нужно выбрать элементы item со значением атрибута source, равным значению этого атрибута текущего узла. Очевидно, путь выборки будет выглядеть как item[предикат], где предикат определяет условие равенства атрибутов текущего и выбираемого. Но как записать это условие? Предикат будет вычисляться в контексте проверяемого элемента item, значит, все относительные пути выборки типа @source или ./@source или self::item/@source будут отсчитываться именно от проверяемого элемента. В этом случае узел контекста и текущий узел преобразования — не одно и то же.

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

item[@source=current()/@source]

Это выражение выберет все дочерние элементы item текущего узла, значение атрибута source которых будет таким же, как и у него.

Функция unparsed-entity-uri

Выражение для этой функции следующее:

string unparsed-entity-uri (string)

Функция unparsed-entity-uri возвращает уникальный идентификатор ресурса, который

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату