передана строка, возвращаемое множество будет состоять из корневого узла внешнего документа. URI этого документа как раз и сообщается строковым аргументом функции
document
.
Интересной особенностью является возможность передать пустую строку:
document('')
В этом случае
document
возвратит корневой узел самого преобразования. При помощи
document('')
можно получать доступ к информации, хранящейся в самом преобразовании (оно ведь тоже является ХМL-документом). К сожалению, перед обращением к документу не существует способа проверить его существование. Процессор может либо выдать ошибку, либо возвратить пустое множество.
множество узлов, можно получить доступ к нескольким документам, URI которых являются строковыми значениями узлов множества. Это, в частности, позволяет обращаться к документам, URI которых указаны в узлах обрабатываемого документа. Например, в контексте элемента
<а href="#">...</а>
вполне корректным вызовом функции
document
будет
document (@href)
.
Выражение
@href
— здесь возвращает множество, состоящее из единственного узла атрибута. Его строковое значение (
"http://www.w3.org"
) будет использовано как URI внешнего документа. Результирующее множество узлов будет содержать единственный корневой узел документа, расположенного по адресу http://www.w3.org.
Приведем еще один пример. XPath-выражение
//a/@href
возвращает множество всех атрибутов
href
элементов
а
текущего документа. Тогда множество document(
//a/@href
) будет содержать корневые узлы всех документов, на которые ссылается посредством элементов а текущий документ.
Вызов 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>
Того же самого эффекта можно достичь следующим образом: