Валиков Алексей Н.
Шрифт:
Функция
document
позволяет обращаться к внешним документам по их URI, например <xsl:copy-of select="document('http://www.w3.org')"/>
скопирует в выходящий документ содержимое главной страницы Консорциума W3.
Функция
document
возвращает множество узлов. В простейшем случае это множество будет состоять из корневого узла внешнего документа. Функцию document
можно использовать в более сложных XPath-выражениях, например в выражениях фильтрации. Так функция <xsl:copy-of select="document('http://www.w3.org')/html/body/a"/>
скопирует все элементы а, находящиеся в теле (
/html/body
) внешнего документа. Базовый сценарий использования функции
document
очень прост: ей передается строка, содержащая URI внешнего ресурса, а результатом является множество узлов, состоящее из корня внешнего документа. Однако на этом возможности document
не заканчиваются. Мы рассмотрим несколько вариантов вызова функции document
с параметрами различного типа. Вызов document(string)
В случае если функции
document
передана строка, возвращаемое множество будет состоять из корневого узла внешнего документа. URI этого документа как раз и сообщается строковым аргументом функции document
. Интересной особенностью является возможность передать пустую строку:
document('')
В этом случае
document
возвратит корневой узел самого преобразования. При помощи document('')
можно получать доступ к информации, хранящейся в самом преобразовании (оно ведь тоже является ХМL-документом). К сожалению, перед обращением к документу не существует способа проверить его существование. Процессор может либо выдать ошибку, либо возвратить пустое множество. Пример
Листинг 8.61. Преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:user="urn:user-namespace">
<user:data>
<item>1</item>
<item>2</item>
</user:data>
<xsl:variable
name="data" select="document('')/xsl:stylesheet/user:data"/>
<xsl:template match="/">
<xsl:copy-of select="$data/item"/>
</xsl:template>
</xsl:stylesheet>
Листинг 8.62. Выходной документ
<item
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:user="urn:user-namespace">1</item>
<item
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:user="urn:user-namespace">2</item>
Вызов document(node-set)
Передавая функции
document
множество узлов, можно получить доступ к нескольким документам, 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
, находящегося в том же каталоге, что и само преобразование.