Функция document
Предоставляет способ извлечения других XML-ресурсов в таблице стилей XSLT за начальными данными, полученными через поток ввода.
node-set document(object, node-set?)
Заметки
Функция document() может выполнять различные действия в зависимости от типа и количества переданных ей аргументов.
Если передается только один аргумент, и этот аргумент представляет собой строку, document() рассматривает ее как URL-адрес и извлекает документ в виде набора узлов. Чтобы увидеть иллюстрирующий код, см. Пример 1 ниже.
Если передается только один аргумент, и этот аргумент представляет собой набор узлов, то каждый его узел рассматривается как URL-адрес, и функция возвращает объединение всех документов, к которым производится обращение. Чтобы увидеть иллюстрирующий код, см. Пример 2 ниже.
Если передается два аргумента, первый аргумент может быть либо строкой, либо набором узлов, а второй аргумент должен быть набором узлов. Второй аргумент, когда он передается, служит для указания базового URL-адреса, относительно которого задан первый аргумент. Чтобы увидеть иллюстрирующий код, см. Пример 3 ниже.
Если функции document() передается пустая строка, результатом является исходный XML-текст самого документа XSLT, если только не передается второй аргумент (и его значение не равно NULL). Во втором случае URL-адрес документа является базовым URL-адресом узла, содержащегося во втором элементе.
Когда XML-документ загружается из страницы ASP с помощью функции document(), в качестве аргумента которой используется абсолютный URL-адрес, свойство ServerHTTPRequest содержащего таблицу стилей XSLT объекта DOM должно иметь значение true еще до инициирования любых преобразований, как показано в следующем фрагменте кода на языке JScript.
xsltDom.setProperty("ServerHTTPRequest", true);
Объясняется это тем, что при выполнении загрузки служба MSXML по умолчанию использует файл URLMON.dll. Однако, ASP не поддерживает URLMON. Поэтому значение данного свойства необходимо изменить таким образом, чтобы при загрузке использовался файл WinHTTP.dll.
Пример 1
В этом примере таблица стилей XSLT (document.xsl) выполняет следующие операции.
С помощью функции document() загружает два XML-документа (hrGroup.xml и myGroup.xml), на которые ссылается исходный XML-документ (document.xml).
Извлекает из загруженных документов элементы <group>.
Вставляет извлеченные элементы в результирующий XML-документ.
Результат преобразований состоит в разрешении ссылок в файле document.xml. Когда для ссылки на внешний XML-документ используется относительный путь, базовый URL-адрес является URL-адресом таблицы стилей XSLT.
Когда преобразование инициируется из скрипта на странице ASP (document.asp), свойство ServerHTTPRequest получает значение true. Необходимость в этом отпадает, когда преобразование инициируется в скрипте JScript (document.js) и выполняется на сервере скриптов Windows или на странице HTML. Здесь используется сервер скриптов Windows.
XML-файл (document.xml)
<?xml version='1.0'?>
<groups>
<groupRef href="https://localhost/hr/hrGroup.xml"/>
<groupRef href="myGroup.xml"/>
</groups>
XML-файл 1 (hrGroup.xml), на который имеется ссылка
<?xml version='1.0'?>
<group name="hr">
<leader>mo</leader>
<member>bo</member>
<member>ko</member>
<member>lo</member>
</group>
XML-файл 2 (myGroup.xml), на который имеется ссылка
<?xml version='1.0'?>
<group name="my">
<leader>john</leader>
<member>jane</member>
<member>jon</member>
<member>jan</member>
</group>
Файл XSLT (document.xsl)
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<groups>
<xsl:apply-templates select="//groupRef"/>
</groups>
</xsl:template>
<xsl:template match="groupRef">
<xsl:copy-of select="document(@href)//group"/>
</xsl:template>
</xsl:stylesheet>
Файл ASP (document.asp)
<%@ LANGUAGE = JScript %>
<%
// Set the source and style sheet locations here.
var sourceFile = Server.MapPath("document.xml");
var styleFile = Server.MapPath("document.xsl");
// Load the XML.
var source = Server.CreateObject("Msxml2.DOMDocument.6.0");
source.setProperty("AllowDocumentFunction", true);
source.async = false;
source.load(sourceFile);
// Load the XSLT.
var style = Server.CreateObject("Msxml2.DOMDocument.6.0");
style.setProperty("AllowDocumentFunction", true);
style.async = false;
style.setProperty("ServerHTTPRequest", true);
style.load(styleFile);
Response.Write(source.transformNode(style));
%>
Файл JScript (document.js)
// Set the source and style sheet locations here.
var sourceFile = ("document.xml");
var styleFile = ("document.xsl");
// Load the XML.
var source = new ActiveXObject("Msxml2.DOMDocument.6.0");
source.setProperty("AllowDocumentFunction", true);
source.async = false;
source.load(sourceFile);
// Load the XSLT.
var style =new ActiveXObject("Msxml2.DOMDocument.6.0");
style.setProperty("AllowDocumentFunction", true);
style.async = false;
style.load(styleFile);
WScript.Echo(source.transformNode(style));
Попробуйте!
Скопируйте помещенные выше образцы кода и вставьте их в файлы на локальном накопителе.
Сохраните файлы с данными именами и расширениями.
На веб-узле на локального компьютера по умолчанию создайте новый виртуальный каталог с псевдонимом hr. Если в качестве веб-сервера используется удаленный компьютер, замените localhost на имя узла веб-сервера в значении атрибута href в файле document.xml. При использовании существующего виртуального каталога замените hr в том же значении атрибута href псевдонимом, присвоенным этому каталогу. Переместите файл hrGroup.xml в каталог, ставший виртуальным каталогом веб-сервера.
В окне браузера Internet Explorer откройте страницу ASP со следующим URL-адресом:
https://localhost/hr/document.asp
Запустите на выполнение файл JScript с помощью следующей команды сервера скриптов Windows.
cscript document.js
Вывод
Далее приведен вывод обработчика. Отступы добавлены для наглядности.
<?xml version="1.0"?>
<groups>
<group name="hr">
<leader>mo</leader>
<member>bo</member>
<member>ko</member>
<member>lo</member>
</group>
<group name="my">
<leader>john</leader>
<member>jane</member>
<member>jon</member>
<member>jan</member>
</group>
</groups>
Пример 2
Этот пример иллюстрирует результат применения набора узлов в качестве аргумента функции document.
XML-файл (document1.xml)
<?xml version='1.0' encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="document1.xsl" ?>
<groups>
<groupRef>hrGroup.xml</groupRef>
<groupRef>myGroup.xml</groupRef>
</groups>
Таблица стилей XSLT (document1.xsl)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"
version="1.0"
encoding="UTF-8"
indent="yes"/>
<xsl:template match="/">
<groups>
<xsl:apply-templates select="/groups/groupRef"/>
</groups>
</xsl:template>
<xsl:template match="groups/groupRef">
<xsl:copy-of select="document(.)//group"/>
</xsl:template>
</xsl:stylesheet>
Попробуйте!
На узле msdn.microsoft.com загрузите файл msxsl.exe, если это еще не сделано.
В командной строке введите следующую команду из каталога, где были сохранены файлы document1.xml и document1.xsl.
msxsl document1.xml document1.xsl
Вывод
Выходные данные аналогичны данным, полученным в Примере 1 выше.
Пример 3
В этом примере показан результат применения двух аргументов при вызове функции document. Второй аргумент, который должен представлять набор узлов, служит базовым URL-адресом первого аргумента. При отсутствии второго аргумента базовый URL-адрес первого аргумента является базовым URL-адресом файла XSLT.
Таблица стилей XSLT (document2.xsl)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<root>
<xsl:comment>One Argument </xsl:comment>
<xsl:for-each select="document('b.xml')//a">
<xsl:copy-of select="."/>
</xsl:for-each>
<xsl:comment>Two Argument </xsl:comment>
<xsl:for-each select="document('a.xml', .)//a">
<xsl:copy-of select="."/>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
XML-файл 1 (b.xml)
<doc>
<a> one </a>
<a> two </a>
<a> three </a>
</doc>
XML-файл 2 (subDir/a.xml)
<doc>
<a> I </a>
<a> II </a>
<a> III </a>
</doc>
Попробуйте!
Сохраните файлы document2.xsl и b.xml в рабочем каталоге.
В командной строке введите следующую команду в рабочем каталоге.
msxsl.exe a.xml document2.xsl
Вывод
<?xml version="1.0" encoding="UTF-8"?>
<root>
<!-- One Argument >
<a> one </a>
<a> two </a>
<a> three </a>
<!-- Two Arguments >
<a> I </a>
<a> II </a>
<a> III </a>
</root>