<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
возвращает уникальный идентификатор ресурса, который