document 函式
提供一個方法,從 XSLT 樣式表中擷取輸入資料流所提供的初始資料以外的其他 XML 資源。
node-set document(object, node-set?)
備註
document() 函式的效果會隨著您所提供的引數型別與數量而有所不同。
若僅提供一個引數且該引數為字串,則 document() 會將此字串視為 URL,並將文件當作節點集來擷取。請參閱下面的範例 1,以檢視程式碼示範。
若僅提供一個引數且該引數為節點集,則該節點集內的每個節點都會被視為 URL,且函式會傳回所有被參考文件的聯集。請參閱下面的範例 2,以檢視程式碼示範。
若有兩個引數,則第一個引數可以是字串或節點集,而第二個引數必須是節點集。如果有提供第二個引數,則表示第一個引數內容的相對基底 URL。請參閱下面的範例 3,以檢視程式碼示範。
若將空字串傳遞到 document() 函式中,除非指定了第二個引數 (且非 Null),否則結果即為 XSLT 文件本身的來源 XML。在第二個情況下,文件的 URL 即為第二個項目所含節點的基底 URL。
使用 document() 函式搭配絕對 URL 做為引數,從 ASP 頁面下載 XML 文件時,在具有 XSLT 樣式表的 DOM 物件上,必須將 ServerHTTPRequest 屬性設為 true,才能啟始轉換,如下列 JScript 程式碼片段所示:
xsltDom.setProperty("ServerHTTPRequest", true);
之所以如此,是因為 MSXML 會使用 URLMON.dll 做為預設值來支援檔案下載。但 ASP 並不支援 URLMON。因此,您必須設定此屬性以選擇 WinHTTP.dll 做為下載的替代方式。
範例 1
在此範例中,XSLT 樣式表 (document.xsl) 會執行下列步驟:
使用 document() 函式,下載兩份在來源 XML 文件 (document.xml) 中參考的 XML 文件 (hrGroup.xml 與 myGroup.xml)。
從已下載的文件中擷取 <group> 項目。
將取出的項目插入結果 XML 文件中。
轉換的結果會解析 document.xml 中的參考。當相對路徑是用來參考外部 XML 文件時,基底 URL 即為 XSLT 樣式表的基底 URL。
當轉換是從 ASP 頁面 (document.asp) 中的指令碼啟動時,ServerHTTPRequest 屬性會設為 true。當轉換在 JScript (document.js) 中啟動,並於 Windows Scripting Host 或 HTML 頁面中執行時,並不需要作此設定。此處使用 Windows Script Host。
XML 檔 (document.xml)
<?xml version='1.0'?>
<groups>
<groupRef href="http://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 的新虛擬目錄。若您使用遠端電腦做為 Web 伺服器,請在 document.xml 內的 href 屬性值中,將 localhost 變更為 Web 伺服器的主機名稱。若您使用現有的虛擬目錄,請將相同 href 屬性值中的 hr 變更為該目錄所有的任何別名。將 hrGroup.xml 檔案移至已成為 Web 伺服器虛擬目錄的目錄中。
在 Internet Explorer 瀏覽器視窗中,以下列 URL 開啟 ASP 頁面:
http://localhost/hr/document.asp
使用下列 Windows Scripting Host 命令來執行 JScript 檔案:
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 即為 XSLT 檔案的基底 URL。
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>