本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

ヒント: 巨大なXML文書は分割して攻略する

XSLTで文書を分断する方法

Benoit Marchal (bmarchal@pineapplesoft.com), Consultant, Pineapplesoft
Benoit Marchal氏は、ベルギーのナミュールを拠点にしたコンサルタントおよび著述家です。彼の著作には、 XML by Example(Que社、邦訳: インプレス社「実例で学ぶXML」。間もなく第2版が出版される予定です)、 Applied XML Solutions および XML and the Enterprise があります。また、Gamelanのコラムや、developerWorks XML zoneのコラムWorking XML の著者でもあります。最新プロジェクトの詳細については、www.marchal.com をご覧ください。

概要: 時として、容量が大きすぎて、そのままでは公開できないXMLファイルにでくわすことがあります。この問題を解決するためには、XSLTプロセッサーを使って、より小さなファイルにしてしまうことです。このヒントでは、一般的なXSLTプロセッサーで文書を分断する方法を説明します。

日付:  2003年 6月 05日
レベル:  初級 この記事の原文:  英語
アクティビティー: 3414 ビュー
お気軽にご意見・ご感想をお寄せください: 


前回のヒント(参考文献をご覧ください)では、スタイルシートを使って、異なるXMLドキュメントを結合する方法について説明しました。例を示すために、4つのXMLドキュメントが最終的に組み合わされて1つのWebページとして構成されるフォトギャラリーを使いました。このテクニックはログファイル(日々のログを結合した月報)や目次(幾つかの章を結合した1つの目次)などにも役立ちます。

今回のヒントでは異なるアプローチをします。1つのXMLドキュメントがあり、出力すると数ページにわたる時、あなたはどうしますか。より速くダウンロードするために、長いドキュメントをより短く分断するのではないでしょうか。

フォトギャラリー

リスト1の文書は、解説付きの4枚の写真からなる小さなフォトギャラリーです。あなたの課題は、小規模なWebサイトに文書をデザインすることです。ダウンロードを速くするためには、各写真をそれぞれのページに置くべきです。難しいのは、写真があるページ毎にオリジナルの文章を分割することです。

ページを分割するにあたって、良い話と悪い話があります。良い話は、一般的なXSLTプロセッサーを使って、好きなだけドキュメントを分割できることです。悪い話は、この機能が(まだ)標準ではないことです。ご存知のように、XSLTプロセッサー毎に異なったインプリメントになっています。ただ幸いなことに、その差異は表面的なものです。


インスタントパブリッシング

リスト2はフォトギャラリーを公開するためのスタイルシートです。gl:photoのテンプレートに注目してください。このテンプレートは、xalan:redirectインストラクションによって、分割されたHTMLページを作成してそれらを保存します。このスタイルシートはJDK1.4.1によってテストされ、JDK XLSTプロセッサ、Xalan単体(Apache XalanはJAXPのリファレンス・インプリメントです)のいずれかで動作します。


リスト2:jdk.xsl--JDK1.4(またはXalan)用のスタイルシート
                
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gl="http://ananas.org/2003/tips/gallery"
xmlns:xalan="org.apache.xalan.xslt.extensions.Redirect"
extension-element-prefixes="xalan">
<xsl:output method="html"/>
<xsl:template match="gl:gallery">
<html>
<head><title><xsl:value-of select="gl:title"/></title></head>
<body>
<h1><xsl:value-of select="gl:title"/></h1>
<p>The photos are <a href="photo-0.html">here</a>.</p>
</body>
</html>
<xsl:apply-templates select="gl:photo"/>
</xsl:template>
<xsl:template match="gl:photo">
<xalan:write select="concat('photo-',position(),'.html')">
<html>
<head><title><xsl:value-of select="gl:title"/></title></head>
<body>
<img src="{gl:image}" align="left"/>
<h1><xsl:value-of select="gl:title"/></h1>
<p><xsl:value-of select="gl:date"/></p>
<p><xsl:value-of select="gl:description"/></p>
<p>
<xsl:if test="preceding-sibling::gl:photo">
<a href="photo-{position() - 1}.html">Previous</a>
<xsl:text> </xsl:text>
</xsl:if>
<xsl:if test="following-sibling::gl:photo">
<a href="photo-{position() + 1}.html">Next</a>
</xsl:if>
</p>
</body>
</html>
</xalan:write>
</xsl:template>
</xsl:stylesheet>

ソースコード(参考文献を参照してください)は、このコードをテストするためにドキュメント、スタイル・シートおよび小さなJavaアプリケーションを含んでいます。JDK1.4上で、動作することを確認してください。

xalan:redirectは対象要素の内容を別々のファイルにセーブするようプロセッサーに伝えます。ファイル名は、select属性で指定します。この例では、スタイルシートが写真の番号(正確にはその位置)をphoto-xに付加してファイル名を決定します。ファイルはphoto-1.htmlphoto-2.htmlphoto-3.htmlphoto-4.htmlになります。

残念なことに、xalan:redirectは、標準の一部ではありませんので、他のプロセッサーはそれを認識しません。xalan:redirectは拡張機能としてインプリメントされます。拡張であることを宣言するために、最初にネーム・スペースとしてorg.apache.xalan.xslt.extensions.Redirect URIを宣言しなければなりません。明らかに、org.apache.xalan.xslt.extensions.Redirectは正当なURIではありませんが、xalanはまだそれを認識します。次に拡張機能のネーム・スペースをextension-element-prefixes属性で宣言しなければなりません。ネーム・スペースの宣言およびextension-element-prefixes属性は、共にxsl:stylesheet要素内に記述する必要があります。


他のプロセッサーはどうか?

Xalanは優れたプロセッサーです。しかし、もしあなたが他のプロセッサーを使いたいとしたらどうでしょうか?今のところ、あなたの好みのXSLTプロセッサーの資料を丹念に調べ、同等の拡張機能を探し出さなければなりません。私の知りうる限りでは、全てのXSLTプロセッサーが、複数文書の出力をサポートするために、少なくとも1つは拡張機能を提供しています。

例えば、あなたがMichael Kayの優れたSaxonプロセッサーを使用したいと思うなら、xalan:redirectの代わりにsaxon:outputを使うように、gl:photo のテンプレートを書き直すことになるでしょう。saxon:outputxalan:redirectに非常に似ているので、最小限の変更で対応できます。リスト3はリスト2のSaxonバージョンです(拡張機能のために定義したネーム・スペースSaxonの使い方に注意してください)。


リスト3:saxon.xsl -Saxon用のスタイルシート
                
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:gl="http://ananas.org/2003/tips/gallery"
xmlns:saxon="http://icl.com/saxon" extension-element-prefixes="saxon">
<xsl:output method="html"/>
<xsl:template match="gl:gallery">
   <html>
      <head><title><xsl:value-of select="gl:title"/></title></head>
      <body>
         <h1><xsl:value-of select="gl:title"/></h1>
         <p>The photos are <a href="photo-1.html">here</a>.</p>
      </body>
   </html>
   <xsl:apply-templates select="gl:photo"/>
</xsl:template>
<xsl:template match="gl:photo">
   <saxon:output href="photo-{position()}.html">
      <html>
         <head><title><xsl:value-of select="gl:title"/></title></head>
         <body>
            <img src="{gl:image}" align="left"/>
            <h1><xsl:value-of select="gl:title"/></h1>
            <p><xsl:value-of select="gl:date"/></p>
            <p><xsl:value-of select="gl:description"/></p>
            <p>
               <xsl:if test="preceding-sibling::gl:photo">
                  <a href="photo-{position() - 1}.html">Previous</a>
                  <xsl:text> </xsl:text>
               </xsl:if>
               <xsl:if test="following-sibling::gl:photo">
                  <a href="photo-{position() + 1}.html">Next</a>
               </xsl:if>
            </p>
         </body>
      </html>
   </saxon:output>
</xsl:template>
</xsl:stylesheet>

W3Cで現在開発中のXLST2.0では、多重出力を生成する標準仕様を定義しています。実際のところ、それはxalan:redirectsaxon:outputに非常によく似ていますが、標準的な名前が与えられました。XSLT2.0の2003年5月2日のドラフト(執筆時点で最新のドラフト)で、xsl:result-documentインストラクションとなっています。リスト4は、その使用法を示したものです。この例がversion属性によって示されるように、XSLT2.0のスタイルシートであることに注意してください。


リスト4:xsl2.xsl --XSLT2.0スタイルシートで新標準を利用する
                
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:gl="http://ananas.org/2003/tips/gallery">
<xsl:output method="html"/>
<xsl:template match="gl:gallery">
   <xsl:apply-templates select="gl:photo"/>
   <html>
      <head><title><xsl:value-of select="gl:title"/></title></head>
      <body>
         <h1><xsl:value-of select="gl:title"/></h1>
         <p>The photos are <a href="photo-0.html">here</a>.</p>
      </body>
   </html>
</xsl:template>
<xsl:template match="gl:photo">
   <xsl:result-document href="photo-{position()}.html">
      <html>
         <head><title><xsl:value-of select="gl:title"/></title></head>
         <body>
            <img src="{gl:image}" align="left"/>
            <h1><xsl:value-of select="gl:title"/></h1>
            <p><xsl:value-of select="gl:date"/></p>
            <p><xsl:value-of select="gl:description"/></p>
            <p>
               <xsl:if test="preceding-sibling::gl:photo">
                  <a href="photo-{position() - 1}.html">Previous</a>
                  <xsl:text> </xsl:text>
               </xsl:if>
               <xsl:if test="following-sibling::gl:photo">
                  <a href="photo-{position() + 1}.html">Next</a>
               </xsl:if>
            </p>
         </body>
      </html>
   </xsl:result-document>
</xsl:template>
</xsl:stylesheet>


まとめ

Webサイトを公開する場合、1つのXMLドキュメントを幾つかのより小さなファイルに分断することは、一般的にダウンロードの速度向上などに役立ちます。さらに、フレーム上で動作する時にも役立ちます。多重出力は画面表示に限定されません。私は電子商取引プロジェクトの中で、巨大なデータベース出力をより小さくして、管理しやすいファイルにするためにも、この技術を使用しました。


参考文献

著者について

Benoit Marchal

Benoit Marchal氏は、ベルギーのナミュールを拠点にしたコンサルタントおよび著述家です。彼の著作には、 XML by Example(Que社、邦訳: インプレス社「実例で学ぶXML」。間もなく第2版が出版される予定です)、 Applied XML Solutions および XML and the Enterprise があります。また、Gamelanのコラムや、developerWorks XML zoneのコラムWorking XML の著者でもあります。最新プロジェクトの詳細については、www.marchal.com をご覧ください。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML
ArticleID=242487
ArticleTitle=ヒント: 巨大なXML文書は分割して攻略する
publish-date=06052003
author1-email=bmarchal@pineapplesoft.com
author1-email-cc=dwxed@us.ibm.com

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。