印刷用ページ       送信     
クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
テクニカルドキュメント
コラム
 MSDN Online Voices - オンライン工作教室 : 目次...

  低帯域幅での表示をオンにする
オンライン工作教室 : 目次の更新

by Bryn Waibel, Stuart Updegrave

December 21, 2000
日本語版最終更新日 2001年2月23日

Download MSDN Code Center からサンプル (TOCcode.exe) をダウンロードする

7 月に掲載した 「オンライン工作教室 : MSDN の新たな目次作成」 では、MSDN 開発チームが新しい MSDN TOC を設計、作成した過程について紹介しました。これ以降、多数のご意見、ご感想をいただいたため、この TOC にいくつか変更を加えました。今回は、これまでにいただいたご意見の中でも最も参考になったご意見をいくつか紹介します。変更の理由を明らかにし、変更点について説明します。また、TOC の要件についても説明します。

決定事項 : Java、HTML Help、Web テクノロジ

既存の実装を変更することに至った理由と、設計上の決定事項についての決定の過程を教えてほしいという読者の方が多数いらっしゃいました。以前は Java で TOC を作成したため、この TOC を変更したのだという皮肉的な見方もありました。これはある程度真実に当てはまります。多くのファイアウォールは、セキュリティ上の理由から Java を除外します。つまり、社内環境で MSDN ライブラリをナビゲートすることは非常に困難です。さらに、Macintosh ではアプレットが適切に機能しません (サーバー ログによれば、MSDN Online のユーザー ベースでは Macintosh ユーザーはごく少数ですが)。この 2 つの理由が、既存の実装を変更することに決定した主な要因です。

ある読者の方から、新しい TOC レンダリング エンジンとしてなぜ HTML Help を採用しなかったのかというご質問がありました。これにはいくつかの理由があります。第一に HTML Help で TOC を実装する場合、クライアント側の ActiveX コントロールを使用する必要があることが挙げられます。この場合、Windows プラットフォームで Internet Explorer 3.0 以降を使用していないユーザーは TOC を使用できなくなります。第二に、我々は Web 開発チームであり、制限のあるバージョンの代わりに ASP、XML、JScript、CSS など、一般的な Web テクノロジを使用したかったのです。クライアント側スクリプトを排除するファイアウォールは少ないため、一般的な Web テクノロジを使用した結果、ユーザー ベースが劇的に増加しました。ユーザー ベース増加のもう 1 つの理由としては、Internet Explorer の DHTML に対応していないクライアントのサポートを強化する方向で実装を実現できたことがあります。

要件

オンライン工作教室の最初の記事では要件のセクションを省略しました。今回はさまざまなケースでの要件について説明し、他の高価なオプションを使用せずに済む方法について説明します。

XML 2.0

XML 2.0 を入手するには、Internet Explorer 5.0 または 5.5 をインストールするか、あるいは再配布可能な MSXML 2.5 Service Pack 1 をダウンロードします。このサンプルに統合されている XSL は、バージョン 2.5 以降の MSXML での使用は設計上想定されていませんが、バージョン 2.5 以降でもこの XSL を動作させることができます。次に示す XSL 名前空間宣言を変更する必要があります。


<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

                

新しい XSLT 名前空間定義を参照するようにこの宣言を変更します。


<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl=http://www.w3.org/1999/XSL/Transform
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output omit-xml-declaration="yes" standalone="no" encoding="UTF-8"/>

                

新しいバージョンのパーサーでサンプル コードを使用する際の 2 番目の問題として、サンプル map.xml ファイルでは、url 属性が ID であることを指定するために DTD が使用されている点が挙げられます。MSXML では DTD はサポートされておらず、その代わりに XML Data Reduced (XDR) スキーマ言語が採用されています。つまり、DTD を使用して XML を記述することはできないため、次のような XDR スキーマが必要になります。


<MsdnTocMap>
    <Schema name="map" xmlns="urn:schemas-microsoft-com:xml-data"
                 xmlns:dt="urn:schemas-microsoft-com:datatypes">
       <AttributeType name="url" dt:type="id" />
       <AttributeType name="pth" dt:type="string" />
       <ElementType name="L" model="closed" content="empty">
            <attribute type="url"/>
            <attribute type="pth"/>
       </ElementType>
    </Schema>
    <L url="somefile"  pth="somepath" />
</MsdnTocMap>

                

次に、MSXML 3.0 Parser をインストールし、サンプル ("Microsoft.XMLDOM") のすべての PROGID を "MSXML2.DOMDocument" に置き換えます。これで準備が整いました。

IIS 5.0

サーバーで UTF-8 コードページ 65001 のコンテンツをサポートするには、Internet Information Services (IIS) 5.0 が必要です。拡張文字セットが不要な場合、各 .asp ファイルのコード ページを TOC に対応した適切なコード ページに変更します。通常、1 つの UI エンジンで複数の言語を表示する場合を除いては、拡張文字セットは不要です。

MSDN Magazine には、Michael Kaplan の「Go Global: Designing Your ASP-based Web Site to Support Globalization」という、グローバライズに関する興味深い記事も収録されています。拡張文字セットをサポートする必要がある場合には、この問題に対する Kaplan の対策を利用できます。

Microsoft JScript 5.0 以降

使用している JScript のバージョンが try-catch ブロックをサポートしていない場合には、サンプル コードを実行すると次のエラーが発生することがあります。


"Microsoft JScript compilation error '800a03ea' , Syntax error , /toc.asp, line 8 , try ^"

                

一見するとこれは重大なエラーのようですが、対策はそれほど難しくありません。もちろん、お勧めする解決方法は最新バージョンの Scripting Runtime をインストールする方法です。旧バージョンの JScript を使用する場合はエラー処理を取り除く必要があります。スクリプト ブロックは次のようになります。


try  //これを削除
{  //これを削除
   // ここに処理コード
} //これを削除
catch(e) //これを削除
{ //これを削除
      // ここでエラー処理 // これを削除
} //これを削除

                

Jscript スクリプト エンジンのすべてのバージョンでコードが機能するようにするには "// これを削除" コメント行を使用して各行を削除します。

質問と回答

Q. TOC の構造について理解したいと思っています。例では、単一ディレクトリ (フラットなディレクリ) だけが使用されていますが、実際には、TOC には構造が使用されると思います。どのようなファイルを構造のどの位置に格納する必要があるのか、またファイル タイプごとに必要なバージョンの数がよく分かりません。スクリプトやデータ ファイルに絶対パスをコーディングする必要がありますか?

A. オンライン工作教室の最初の記事に統合されている TOC は、自己解凍ファイルです。フラットなディレクトリ構造を採用した目的は、Web サーバーの任意のディレクトリに .exe ファイルをドロップするだけで、ファイルが自動的に解凍されるようにすることでした。これはサンプルを配布する上では適切でしたが、実際の状況においてどのようなアーキテクチャが機能するかということに関してはあまりヒントを与えるものではありませんでした。

TOC サンプルに対して、何のために locals.inc を使用するのか、という疑問が上がりました。答えは単純です。構造を縮小したのですから、サンプルの .asp ページは 2 つのインクルード ファイルの組合せになるはずです。

toc.asp


<% @codepage="65001"  @LANGUAGE="JScript" %>
<!-- #include file="locals.inc" -->
<!-- #include file="/shared/inc/toc.inc" -->

これは loadtree.asp にも該当します。
<% @codepage="65001"  @LANGUAGE="JScript" %>
<!-- #include file="locals.inc" -->
<!-- #include file="/shared/inc/loadtree.inc" -->

                

これにより、TOC を実行するコードを、Web サイト全体で完全に共有し、再利用できます。Web サイト上の 1 つの実装に固有の情報はすべて locals.inc ファイルに保存されます。

フラットなディレクトリ構造の 2 番目の問題は、この構造ではマップ ファイル役割が明確に示されないという点です。サンプルに付属しているファイルが、フラットではない構造に格納されていることを考えてみましょう。たとえばインクルード ファイル (.inc, .asp) は /sample/inc/ フォルダに、.js ファイルは /sample/js/ フォルダに格納されているとします。ltoc0.xml ファイルの内容は容易に想像できると思います。ref 属性には、ルート相対パスが設定されます。


ref="/sample/js/toc.js"

                

マップ ファイルはどこにあるのでしょうか? マップ ファイルは、TOC で参照されるファイルのすべての格納先フォルダに作成される必要があります。この方法でのみ、多数のファイルの読み込みをファイル システム全体にわたって分散することができるのです。300,000 個の MSDN ライブラリ ノードを、1 つのファイルに記述することはまずありません。

TOC ファイル (ltoc0.xml および msdnce.xml) は、任意の位置に保存できます。唯一の要件は、prePartum 属性が正しい位置を指し示しており、locals.inc が 1 番目の XML ファイルの位置を認識していることです。MSDN では、アプリケーションの下の TOC ディレクトリに TOC ファイルを格納することがよくあります。たとえば、ライブラリの TOC ファイルは http://msdn.microsoft.com/library/en-us/dnexxml/html/toc.xml にあります。

Q. TOC のツリーのトップ レベルだけを表示するのではなく、既定値として最初の 2 ~ 3 レベルを表示するように TOC を設定するにはどうしたらよいですか?

A. 既定値としてツリー内のノードを開いた状態で表示する場合には、該当する .xml ファイルの state 属性を "open" に設定します。たとえばサンプル コードの場合、このページが読み込まれると "MSDN サンプル コード" が表示されるようにするには、XML を次のように記述します。


<MsdnToc>
       <MTN    title="MSDN Code Examples" 
            nodeType="node" 
            type="none" 
            tocPath="msdnce-0" 
            hal="en-us" state="open">
              <MTN    title= "MSDN TOC" 
                  nodeType="collection" 
                  type="none" 
                  tocPath="ltoc0" 
                  hal="en-us" 
                  prePartum="ltoc0.xml"/>
       </MTN>
</MsdnToc>

                

MSDN Code Center のコード サンプルを更新し、この変更を反映しました。

Q. オンライン工作教室の最初の記事には "付属のサンプルのバージョンでは、Internet Explorer バージョン 4.0 以降でのみ TOC が動作します。" と記述されています。Netscape をサポートするにはどうしたらよいですか?

A. TOC が Netscape で動作しないということではありません。サンプルには .css ファイルを組み込みませんでした。TOC は Netscape でも機能しますが、洗練された動作ではありません。.css ファイルは http://msdn.microsoft.com/msdn-online/shared/xmltoc/css/toc_nav.css から入手できます。ブラウザ スニッファを実装し、サンプルの toc.asp にこのファイルへのリンクを追加します。

Q. 私が使用しているサンプルでは、TOC をクリックすると正しいドキュメントがトピック フレームに表示されます。ただし、トピック フレームから TOC フレームへの同期化を行うことができません。トップ ノードだけが表示されます。状況は次のとおりです。

2 つの XML ファイルがメイン ディレクトリ (= virtual FTPROOT dir) にあります。ASP ファイルが既定 ファイルであり、toc ファイルです。トピック フレームに表示されるファイルは ftproot\Software\Cpp\Dependency Tracking.htm です。

ltoc0.xml からの抜粋


MTN title="Dependency Tracking.htm" nodeType="leaf" type="file"
ref="\ftproot\Software\Cpp\Dependency Tracking.htm" tocPath="ltoc0-16-1-0"

map.xml からの抜粋


url="Dependency Tracking.htm" pth="ltoc0-16-1-0"

                

同期化を実行するため、toc.asp: http://-myweb-/ftproot/toc.asp?url=/ftproot/software/cpp/Dependency Tracking.htm を呼び出しました。

A. これは我々の誤りです。サンプルで使用できるように TOC のコードを整理、単純化しましたが、このときに誤って重要な部分を切り取ってしまいました。これが原因でこのエラーが発生したのです。特定の特殊文字を URL で使用する際には、必ずエスケープします。この場合、URL の空白を %20 でエスケープする必要がありました。以下に、誤って削除された関数を示します。更新後のサンプルには、この関数が所定の位置に記述されています。


function FormatFileName( sFileName )
{
    sFileName = unescape( sFileName );
    sFileName = sFileName.replace( /[^\w\.-_:\[\]]/gi , "" );
    if ( sFileName.match( /^[\.\d]/i ) ) sFileName = "f" + sFileName;
    return sFileName;
}

                

Q. SQL Server に保存されている階層一覧を容易に管理できるようにしたいと思っています。ltoc0.xml のようにハード コーディングされたファイルではなく、階層一覧をアセンブルしてから XML を文字列として返すコンポーネントを作成しました。ユーザーがツリーのアイテムをクリックすると、このアイテムのプロパティを示す ASP ページが表示されるようにしたいのです。このため、クエリ文字列に "itemid" フィールドを渡そうと思います。この場合、他のいくつかのパラメータ (mode など) を渡す必要があります。私は"ahref=filename.asp?ItemID=xxx&mode=view" のように、XML 定義の中で "ref" タグをアンカーとして使用してみたのですが、何らかの理由で パラメータを 1 つだけしか受け取ることができません。ItemID を渡す場合は、適切に機能します。しかし、"&Mode=VIEW" を追加すると、ページ上にツリーさえ表示されなくなってしまうのです。

A. MSDN Code Center で TOC を使用できるようにするために作業していたとき、我々も同じ問題に突き当たりました。この問題を解決するため、URL にアンパサンドをエンコードし、最終的にクライアント側でデコードしました。この問題を迅速かつ容易に解決する方法は、MSXML 3.0 にあります。MSXML 3.0 では、変換コンポーネントにエンコード レベルを指定することができます。前述したとおり、新しいバージョンのパーサーでも使用できるようにするためいくつかの修正を加えました。質問のケースでは、ref 属性でアンパサンドを &amp; とエンコードできます。コンポーネント実行後に返された XML に、正しい値を入力します。このとき、スタイルシートの以下の部分を使用します。


<xsl:value-of disable-output-encoding="yes" select="@ref" /> 

                

Q. サンプル map.xml の一部のエントリに、余分な .txt 拡張子が付いているのはなぜですか? ファイル名には .txt 拡張子が付いていないのに、なぜ map.xml ファイルではこのように定義されているのですか? ltoc0.xml ファイルでも、これらのファイルを参照するノードには .txt 拡張子は付いていません。

A. ASP、.css、js ファイルを実行して何の成果も得られないよりも、開発者がソース コードを参照できるようにしたいと考えました。.txt 拡張子を追加するとコンテンツ タイプが変更されるため、サーバーやブラウザでコードが最適な方法 (解析など) で実行されずに、ファイルの内容が表示されます。

Q. なぜツリー ビューに線がないのですか?

A. 線を挿入することはできますし、また線を挿入するにはさまざまな方法があります。この場合、我々の判断で線を組み込まないことにしました。線を挿入する最も簡単な方法としては、フォルダ イメージを線付きのイメージに変更する方法があります。場合によっては .css ファイルを修正し、線と線とをつなぐタグにバックグラウンド イメージを追加することがあります。ただし、特に修正しなくても適切に機能します。

Q. 中国語に対応させるにはどうしたらよいですか?

A. http://msdn.microsoft.com/ja-jp/library/default.aspx を参照してください。中国語システムの UTF-8 で XML を編集する必要があります。Windows 2000 で編集する場合には、中国語フォントとロケール パックをインストールしてください。

Bryn Waibel は、Microsoft のシニア Web 開発者です。現在、次世代の MSDNTechNet、 および Business Web サイトのアーキテクチャの開発に従事しています。

Stuart Updegrave は、 Microsoft のデベロップメント マネージャーです。MSDN、TechNet、Business Web サイトの開発を監督しています。


© 2009 Microsoft Corporation. All rights reserved. 使用条件  |  商標  |  プライバシー
Page view tracker