入力ストリームで提供される初期データにはない、XSLT スタイル シートから他の XML リソースを取得する方法を提供します。
node-set document(object, node-set?)
解説
document()
関数の効果は、提供される引数の型と数によって変わります。
1 つの引数だけが提供され、その引数が文字列の場合、
document()
関数はその文字列を URL として扱い、ドキュメントをノード セットとして読み出します。コードの説明については、以下の例 1 を参照してください。1 つの引数だけが提供され、その引数がノード セットの場合、そのノード セット内の各ノードは URL として扱われ、関数は参照されているすべてのドキュメントの和集合を返します。コードの説明については、以下の例 2 を参照してください。
2 つの引数を指定する場合、2 番目の引数はノード セットにする必要がありますが、最初の引数は文字列またはノード セットのどちらかにできます。2 番目の引数が指定されている場合、その引数は基本 URL を示す役割を果たし、最初の引数の内容はその相対となります。コードの説明については、以下の例 3 を参照してください。
document()
関数に空の文字列が渡された場合、結果は、null でない 2 番目の引数が与えられない限り、XSLT ドキュメント自体のソース XML となります。その場合、ドキュメントの URL は 2 番目の要素に含まれているノードの基本 URL となります。
XML ドキュメントが、引数として絶対 URL を指定した document()
関数を使用して ASP ページ内からダウンロードされる場合は、以下の JScript コード フラグメントに示されているように、すべての変換の開始前に XSLT スタイル シートを保持する DOM オブジェクトの ServerHTTPRequest
プロパティを true
に設定する必要があります。
xsltDom.setProperty("ServerHTTPRequest", true);
これは、MSXML はファイルのダウンロードをサポートするための既定として URLMON.dll を使用するためです。ただし、ASP は URLMON をサポートしていません。そのため、ダウンロードの代替方法として WinHTTP.dll を選択するように、このプロパティを設定する必要があります。
例 1
この例では、XSLT スタイル シート (document.xsl) が次の手順を実行します。
document()
関数を使用して、ソース XML ドキュメント (document.xml) 内で参照されている 2 つの XML ドキュメント (hrGroup.xml および myGroup.xml) をダウンロードします。ダウンロードしたドキュメントから
<group>
要素を抽出します。抽出した要素を結果の XML ドキュメントに挿入します。
変換の効果は document.xml 内の参照を解決することです。外部 XML ドキュメントの参照に相対パスが使用されている場合、基本 URL は XSLT スタイル シートの URL です。
変換が 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.5.0");
source.async = false;
source.load(sourceFile);
// Load the XSLT.
var style = Server.CreateObject("Msxml2.DOMDocument.5.0");
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.5.0");
source.async = false;
source.load(sourceFile);
// Load the XSLT.
var style =new ActiveXObject("Msxml2.DOMDocument.5.0");
style.async = false;
style.load(styleFile);
WScript.Echo(source.transformNode(style));
手順を次に示します。
上記のコード サンプルをコピーしてローカル ドライブ上のファイルに貼り付けます。
与えられた名前と拡張子でファイルを保存します。
ローカル コンピュータ上の既定の Web サイトの下に hr というエイリアスで新しい仮想ディレクトリを作成します。リモート コンピュータを Web サーバーとして使用している場合は、document.xml 内の
href
属性の値にある localhost を Web サーバーのホスト名に変更します。既存の仮想ディレクトリを使用する場合は、同じhref
属性値にある hr をディレクトリ内にある任意のエイリアスに変更します。hrGroup.xml ファイルを Web サーバーの仮想ディレクトリが作成されているディレクトリに移動します。次の URL を使用して ASP ページを Internet Explorer ブラウザ ウィンドウから開きます。
https://localhost/hr/document.asp
次の Windows スクリプト ホスト コマンドを使用して 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>
手順を次に示します。
msxsl.exe をダウンロードしていない場合は msdn.microsoft.com からダウンロードします。
コマンド プロンプトで、document1.xml と document1.xsl を保存したディレクトリから以下のコマンドを入力します。
msxsl document1.xml document1.xsl
出力
出力は、上記の例 1 で作成された出力に似ています。
例 3
この例は、document
関数の呼び出し時に 2 つの引数を使用する効果を示すものです。ノード セットにする必要がある 2 番目の引数は、最初の引数の基本 URL としての役割を果たします。2 番目の引数がない場合、最初の引数の基本 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>