document 函数

提供从 XSLT 样式表中检索由输入流提供的初始数据以外的其他 XML 资源的方法。

node-set document(object, node-set?)

备注

document() 函数的作用根据所提供的参数的类型和数目而有所不同。

  • 如果只提供了一个参数,并且该参数为字符串,document() 将该字符串作为 URL 对待,将文档作为一组节点进行检索。 有关代码说明,请参见下面的示例 1

  • 如果只提供了一个参数,并且该参数为节点集,则该节点集中的每个节点将被作为 URL 对待,函数将返回所有引用的文档的联合。 有关代码说明,请参见下面的示例 2

  • 如果提供了两个参数,第一个参数可以是字符串或节点集,而第二个参数必须是节点集。 如果提供了第二个参数,用于指示第一个参数的内容相对于的基 URL。 有关代码说明,请参见下面的示例 3

  • 如果空字符串传递给 document() 函数,结果是 XSLT 文档本身的源 XML,除非提供了第二个参数(并且不为空)。 在后一种情况下,文档的 URL 是第二个元素中包含的节点的基 URL。

如果使用 document() 函数从 ASP 页中下载 XML 文档,并且该函数使用绝对 URL 作为参数,必须先在存放 XSLT 样式表的 DOM 对象上将 ServerHTTPRequest 属性设置为 true,然后才能进行转换,如下面的 JScript 代码片断中所示:

xsltDom.setProperty("ServerHTTPRequest", true);

这样做的原因是 MSXML 使用 URLMON.dll 作为支持文件下载的默认设置。 但是,ASP 不支持 URLMON。 因此,需要将此属性设置为选择 WinHTTP.dll 作为支持下载的备选设置。

示例 1

在此示例中,XSLT 样式表 (document.xsl) 执行下列步骤:

  1. 使用 document() 函数下载源 XML 文档 (document.xml) 中引用的两个 XML 文档(hrGroup.xmlmyGroup.xml)。

  2. 从下载的文档中提取 <group> 元素。

  3. 将提取的元素插入生成的 XML 文档。

转换的结果是解析 document.xml 中的引用。 如果使用相对路径引用外部 XML 文档,基 URL 是 XSLT 样式表的基 URL。

如果在 ASP 页 (document.asp) 中通过脚本进行转换,ServerHTTPRequest 属性设置为 true。 如果在 JScript (document.js) 中开始转换并在 Windows 脚本宿主或 HTML 页中执行,则不需要这样做。 此处使用的是 Windows 脚本宿主。

ms256465.collapse_all(zh-cn,VS.120).gifXML 文件 (document.xml)

<?xml version='1.0'?>
<groups>
   <groupRef href="https://localhost/hr/hrGroup.xml"/>
   <groupRef href="myGroup.xml"/>
</groups>

ms256465.collapse_all(zh-cn,VS.120).gif引用的 XML 文件 1 (hrGroup.xml)

<?xml version='1.0'?>
<group name="hr">
  <leader>mo</leader>
  <member>bo</member>
  <member>ko</member>
  <member>lo</member>
</group>

ms256465.collapse_all(zh-cn,VS.120).gif引用的 XML 文件 2 (myGroup.xml)

<?xml version='1.0'?>
<group name="my">
  <leader>john</leader>
  <member>jane</member>
  <member>jon</member>
  <member>jan</member>
</group>

ms256465.collapse_all(zh-cn,VS.120).gifXSLT 文件 (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>

ms256465.collapse_all(zh-cn,VS.120).gifASP 文件 (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));
%>

ms256465.collapse_all(zh-cn,VS.120).gifJScript 文件 (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));

尝试一下!

  1. 复制上面的代码示例,然后粘贴到本地驱动器的文件中。

  2. 使用指定的名称和扩展名保存文件。

  3. 在本地计算机的默认网站下创建一个新的虚拟目录,别名为 hr。 如果使用远程计算机作为 Web 服务器,在 document.xml 中的 href 属性值中将 localhost 更改为 Web 服务器的主机名。 如果使用现有的虚拟目录,将同一 href 属性值中的 hr 更改为该目录的任意别名。 将 hrGroup.xml 文件移动到已成为 Web 服务器的虚拟目录的目录。

  4. 从 Internet Explorer 浏览器窗口中打开以下 URL 的 ASP 页:

    https://localhost/hr/document.asp

  5. 使用以下 Windows 脚本宿主命令运行 JScript 文件:

cscript document.js

ms256465.collapse_all(zh-cn,VS.120).gif输出

以下是处理器输出,为了清楚起见,增加了缩进。

<?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 函数的参数的效果。

ms256465.collapse_all(zh-cn,VS.120).gifXML 文件 (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>

ms256465.collapse_all(zh-cn,VS.120).gifXSLT 样式表 (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>

尝试一下!

  1. 从 msdn.microsoft.com 下载 msxsl.exe(如果尚未下载)。

  2. 在命令提示符下,从保存 document1.xmldocument1.xsl 的目录中运行以下命令:

msxsl document1.xml document1.xsl

ms256465.collapse_all(zh-cn,VS.120).gif输出

输出类似于上面的示例 1 中生成的输出。

示例 3

此示例显示在调用 document 函数时使用两个参数的效果。 第二个参数必须是节点集,作为第一个参数的基 URL。 如果没有第二个参数,第一个参数的基 URL 是 XSLT 文件的基 URL。

ms256465.collapse_all(zh-cn,VS.120).gifXSLT 样式表 (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>

ms256465.collapse_all(zh-cn,VS.120).gifXML 文件 1 (b.xml)

<doc>
 <a> one </a>
 <a> two </a>
 <a> three </a>
</doc>

ms256465.collapse_all(zh-cn,VS.120).gifXML 文件 2 (subDir/a.xml)

<doc>
 <a> I </a>
 <a> II </a>
 <a> III </a>
</doc>

尝试一下!

  1. document2.xslb.xml 保存到工作目录中。

  2. 从命令提示符下,在工作目录中键入以下命令:

msxsl.exe a.xml document2.xsl

ms256465.collapse_all(zh-cn,VS.120).gif输出

<?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>

请参见

参考

<xsl:copy-of> 元素