<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(''))'/>
Протестируем теперь все это вместе в одном преобразовании.
<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>
<doc>doc.xml</doc>
<doc>a/doc.xml</doc>
<doc>doc.xml</doc>
<doc>doc.xml</doc>
<doc>a/doc.xml</doc>
<doc>a/doc.xml</doc>
<doc>doc.xml</doc>
Вызов
Если функции document передаются два множества узлов, то вычисление результата можно описать примерно следующим образом:
□ каждый из узлов первого аргумента преобразуется в строковый вид;
□ для каждого из полученных значений выполняется вызов типа document(string, node-set);
□ результирующие множества объединяются.
Иными словами, document(node-set, node-set) работает через document (string, node-set) точно так же, как document(node-set) работает через document(string). Разница лишь в том, что в первом случае базовый URI будет изменен.
Другие дополнительные функции XSLT
Функция
Выражение для этой функции имеет вид:
Функция current возвращает множество, состоящее из текущего узла преобразования.
Мы часто использовали термины текущий узел и узел контекста как синонимы: действительно, в большинстве случаев между ними нет никакой разницы, текущий узел преобразования совпадает с узлом контекста вычисления выражений. Однако бывают ситуации, когда они являются двумя различными узлами.
Представим себе, что нам нужно выбрать элементы item со значением атрибута source, равным значению этого атрибута текущего узла. Очевидно, путь выборки будет выглядеть как item[, где предикат определяет условие равенства атрибутов текущего и выбираемого. Но как записать это условие? Предикат будет вычисляться в контексте проверяемого элемента item, значит, все относительные пути выборки типа @source или ./@source или self::item/@source будут отсчитываться именно от проверяемого элемента. В этом случае узел контекста и текущий узел преобразования — не одно и то же.
Для того чтобы обратиться в предикате именно к текущему узлу, следует использовать функцию current:
item[@source=current()/@source]
Это выражение выберет все дочерние элементы item текущего узла, значение атрибута source которых будет таким же, как и у него.
Функция
Выражение для этой функции следующее:
Функция unparsed-entity-uri возвращает уникальный идентификатор ресурса, который
