次の方法で共有


document 関数

入力ストリームで提供される初期データにはない、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) が次の手順を実行します。

  1. document() 関数を使用して、ソース XML ドキュメント (document.xml) 内で参照されている 2 つの XML ドキュメント (hrGroup.xml および myGroup.xml) をダウンロードします。

  2. ダウンロードしたドキュメントから <group> 要素を抽出します。

  3. 抽出した要素を結果の 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));

手順を次に示します。

  1. 上記のコード サンプルをコピーしてローカル ドライブ上のファイルに貼り付けます。

  2. 与えられた名前と拡張子でファイルを保存します。

  3. ローカル コンピュータ上の既定の Web サイトの下に hr というエイリアスで新しい仮想ディレクトリを作成します。リモート コンピュータを Web サーバーとして使用している場合は、document.xml 内の href 属性の値にある localhost を Web サーバーのホスト名に変更します。既存の仮想ディレクトリを使用する場合は、同じ href 属性値にある hr をディレクトリ内にある任意のエイリアスに変更します。hrGroup.xml ファイルを Web サーバーの仮想ディレクトリが作成されているディレクトリに移動します。

  4. 次の URL を使用して ASP ページを Internet Explorer ブラウザ ウィンドウから開きます。

    https://localhost/hr/document.asp

  5. 次の 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>

手順を次に示します。

  1. msxsl.exe をダウンロードしていない場合は msdn.microsoft.com からダウンロードします。

  2. コマンド プロンプトで、document1.xmldocument1.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>

手順を次に示します。

  1. document2.xslb.xml を作業ディレクトリに保存します。

  2. コマンド プロンプトから、作業ディレクトリ内で次のコマンドを入力します。

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>

参照

リファレンス

<xsl:copy-of> 要素