1 つの XSLT スタイルシートを使用して HTML と PDF で XML データを公開する

簡単かつ迅速に XML データを HTML と PDF に変換する

CSSToXSLFO ユーティリティーを使用して HTML と PDF で XML 文書を公開する方法を学びましょう。

Claudius Teodorescu, XML Consultant, Independent author

Photo of Claudius TeodorescuClaudius Teodorescu はルーマニアのブカレスト在住の XML コンサルタントです。彼は XML、XForms、XPath、XSLT、XSD に 7 年を超える経験があります。



2012年 2月 03日

前提条件

この記事を読む上では、XML およびその他の W3C 標準を理解していると役立ちます。この記事で紹介する例を実行するためには、eXist XML データベースとそのデジタル出版用 XQuery 拡張機能をインストールする必要があります (「参考文献」を参照)。

データを保存する場合、例えば XRX (XForms/REST/XQuery) アーキテクチャー (「参考文献」を参照) の一部として保存することは、現在では一般的になっています。このようにして保存されたデータは照会、取得、そして必要なフォーマットにシリアライズすることができます。Web アプリケーションを開発している場合は、ユーザーが (Web ブラウザーで表示できるように) HTML フォーマットでデータを取得できるようにしたい場合もあれば、(ダウンロードして後で使用できるように) PDF ファイルとして取得できるようにしたい場合もあります。

この記事では、CSSToXSLFO ユーティリティー (「参考文献」を参照) をベースとして使用し、XQuery 拡張機能の助けを借りて XML データを HTML に変換し、その HTML から XSL-FO に変換し、さらにその XSL-FO から PDF に変換する方法について説明します。

XML データを他のフォーマットに変換する

よく使われる頭文字語

  • CSS: Cascading Style Sheets
  • HTTP: HyperText Transfer Protocol
  • JAR: Java ARchive
  • LDAP: Lightweight Directory Access Protocol
  • SQL: Structured Query Language
  • W3C: World Wide Web Consortium
  • XSL-FO: Extensible Stylesheet Language Formatting Objects
  • XSLT: Extensible Stylesheet Language Transformations

通常、XML データから HTML そして XSL-FO に変換するためには 2 つの XSL スタイルシートが必要です。つまり 1 つのスタイルシートで XML を HTML に変換し、もう 1 つの XSL-FO スタイルシートで HTML を XSL-FO 文書に変換した後、XSL-FO プロセッサーを使用して PDF に変換します。HTML と PDF でレポートを生成する Web アプリケーションなどの環境の場合、このプロセスではデータを HTML に変換する新しい XSLT スタイルシートを作成し、続いて HTML を XSL-FO に変換する XSL-FO スタイルシートを作成、デバッグ、保守する必要があります。2 つのスタイルシートを同期させるのは困難であり、また XSL-FO の処理は容易ではありません。幸いなことに、それらのレポートは高度なものである必要はないため、レポートのレイアウトを CSS ファイルで容易に表現することができます。そして、CSSToXSLFO ユーティリティーを使用することで、その CSS ファイルをさらに処理することができ、わずかにコーディングをするだけで、CSSToXSLFO ユーティリティーが XSL-FO 文書を生成してくれます。

このプロセス、そして他の似たような状況は、この記事で説明する方法 (つまり XML を HTML に変換する XSLT スタイルシートを作成し、そのスタイルシートに CSS 命令をいくつか追加することによって HTML を XSL-FO に変換し、さらに PDF に変換できるようにする方法) の応用例として最適です。


CSSToXSLFO ユーティリティー

CSSToXSLFO ユーティリティーを利用すると、XML 文書を CSS2 (CSS バージョン 2) スタイルシートと併せて XSL-FO 文書に変換することができます。このユーティリティーを使用するために、デジタル出版用の XQuery 拡張モジュールの一部として、私は eXist XML データベースに対する XQuery 拡張機能を作成しました。

CSSToXSLFO ユーティリティーは CSS2 仕様の大部分を処理することができます。特定の XSL-FO 機能に対応するために、このユーティリティーはブラウザーで通常無視される CSS 拡張命令をいくつか提供しています。これらのプロパティーを CSS スタイルシートの @media print セクションの @page ルールの中で使用します。これらのプロパティーが関係するものには、ページ領域、ページ番号付け、参照、箇条書きの行頭文字、名前付きストリング、ハイフォネーション、脚注、外部グラフィックス、外部要素などがあります。CSSToXSLFO ユーティリティーについての詳細や、皆さんが設計する XSLT スタイルシートを改善するためのヒントについては、CSSToXSLFO ユーティリティーのマニュアルを参照してください (「参考文献」を参照)。


eXist XML データベース

eXist データベースは、XML 技術を用いてすべてが構築されたオープンソースのデータベース管理システムで、XQuery、XPath、XSLT などの標準をサポートしています。eXist は、非常に厳密に XQuery 標準に準拠しており、データを格納する際には XML データ・モデルに従って格納し、格納されたデータは索引を用いて XQuery で処理されます。また eXist には Apache Lucene に基づく全文索引があります。

eXist の XQuery エンジンは拡張可能です。そのため、eXist にはさまざまな XQuery 拡張モジュールがあります。これらのモジュールは以下に挙げる内容を目的とした XQuery 拡張機能を提供します。

  • キー・バリュー型のグローバルなキャッシュ
  • さまざまな圧縮操作
  • 日付型と時刻型に対する追加操作
  • ファイルとディレクトリーに対するさまざまな操作
  • HTTP リクエスト (XPath モジュール)
  • データベースに格納された画像に対する操作 (画像サイズの取得、サムネイルの作成、画像のリサイズなど)
  • JNDI (Java Naming and Directory Interface) ベースのディレクトリー (LDAP など) へのアクセスと操作
  • テキスト形式または HTML 形式の e-メールの送信
  • ジョブのスケジューリングと既存ジョブに対する操作
  • リレーショナル・データベース管理システムに対する SQL 操作の実行
  • XML ノード間の違いの判定
  • XSL-FO の描画
  • XProc 機能
  • 暗号操作

eXist と CSSToXSLFO はどちらも Java 言語で作成されています。この記事の執筆時点で、eXist では XSL-FO プロセッサーとして Apache FOP (Formatting Objects Processor) または RenderHouse XEP を使用することができます。eXist データベースのインストール方法については eXist の Web サイトを確認してください。eXist データベースをインストールすると、この記事で紹介する例を実行することができます。

デジタル出版用 eXist モジュール

デジタル出版用 eXist モジュールは現在開発中であり、今後さらに機能が追加されるはずです。現状の eXist モジュールには、この記事で紹介する方法に活用できる html-to-xslfo() 関数があります。

このモジュールの目的は、さまざまなフォーマット間の変換など、デジタル出版に必要なすべての XQuery 拡張機能を 1 つのソースで提供できるようにすることです。対象とするフォーマットには、DocBook、Open XML、DOC、DOCX、HTML、PDF、TXT、RTF、PPT、PPTX、CSV などがあります。このモジュールを eXist にインストールするためには以下の手順に従います。

  1. デジタル出版用 eXist モジュールの JAR をダウンロードし、$EXIST_HOME/lib/extensions にコピーします。
  2. css2xslfo1_6_2.jar をダウンロードし、$EXIST_HOME/lib/user にコピーします。
  3. $EXIST_HOME/conf.xml ファイルの組み込みモジュール・セクションに <module class="ro.kuberam.kPub.kPubModule" uri="http://kuberam.ro/k-Pub"/> を追加します。

このセクションでは、eXist のデジタル出版用 XQuery 拡張モジュールに CSSToXSLFO を実装して使用する例を詳しく説明します。そのために、リスト 1 に示す XML データと、「ダウンロード」セクションのサンプル・コードに含まれている XSLT スタイルシート (xml-to-html.xsl) を使用します。

注: ここでは記事を読みやすくするために、使用する XSLT スタイルシートの完全な内容は含めてありません。ここで示している要素は、スタイルシートが XML から HTML、そして PDF への変換に適したものになるようにするためのものに限定しています。

これらの例は、eXist のルート・コレクションにある html-and-pdf-single-stylesheet というコレクション内の eXist XML データベースにアップロードされます。そのため、それぞれの例をブラウザーに表示することができます。例えば、例 1 を表示するためにはブラウザーのアドレス・バーに以下の URL を入力します (eXist がローカルにインストールされていると想定しています)。

http://127.0.0.1:8080/rest/db/html-and-pdf-single-stylesheet/example%201/example1.xql

CSSToXSLFO ユーティリティーの機能を最大限に活用する上で、リスト 2リスト 3 に示す XQuery コード (それぞれ HTML フォーマット、PDF フォーマットで XML データを表示します) 以外に XQuery コードは必要ありません。もっと改善された PDF 文書を取得するためには、XSLT スタイルシートの CSS セクションに CSS 命令を追加する必要があります。

リスト 1. 発行された請求書の概要を表す XML 文書 (サンプル・コードの中の xml-data.xml ファイル)
<invoices-summary> 
  <invoice id=""> 
    <issue-date>2011-10-17</issue-date> 
    <amount>108</amount> 
    <vat>19.47</vat> 
    <vat-base>22</vat-base> 
    <currency>EURO</currency> 
    <customer-id>0001008</customer-id>
   </invoice> 
  <invoice id=""> 
    <issue-date>2011-10-17</issue-date> 
     <amount>40</amount> 
    <vat>7.21</vat> 
     <vat-base>22</vat-base> 
     <currency>EURO</currency> 
    <customer-id>0000017</customer-id> 
  </invoice> 
  <invoice id=""> 
    <issue-date>2011-10-17</issue-date> 
    <amount>1700</amount> 
    <vat>306.56</vat> 
    <vat-base>22</vat-base> 
    <currency>EURO</currency> 
     <customer-id>0000040</customer-id> 
  </invoice> 
</invoices-summary>

最初の例であるリスト 2 は、リスト 1 の XML データを HTML に変換する XQuery スクリプトです。このスクリプトは eXist の transform:transform() 関数を使用しており、この関数が XSLT スタイルシートと (オプションとして) 変換パラメーターを使用して XML データを変換します。XSLT スタイルシートは (Apache Xalan をベースに) XSLT 1.0 で作成することも、(オプションとして Saxon を使用して) XSLT 2.0 で作成することもできます。

リスト 2. XML データを HTML に変換する XQuery スクリプト (サンプル・コードの中の example-01.xql ファイル)
xquery version "1.0"; 
let $xml-data := doc('/db/html-and-pdf-single-stylesheet/xml-data.xml') 
let $xslt-stylesheet := doc( '/db/html-and-pdf-single-stylesheet/xml-to-html.xsl' ) 
let $html := transform:transform($xml-data, $xslt-stylesheet, ()) 
return $html

図 1 は HTML に変換された文書をブラウザーで表示した結果を示しています。この HTML 文書は 3 つの請求書の詳細をまとめてサンセリフ・フォントで表示しています (図 1 と図 2 のコンテンツをテキストにしたものを表示するにはここをクリックしてください)。

図 1. HTML に変換した結果
HTML に変換した結果を示すスクリーン・キャプチャー

まず、先ほどの例と同じように、XML データを HTML に変換します。HTML に変換された文書には、その HTML 文書を意図したとおりに表示するために必要な CSS 命令がすべて含まれており、さらには XSL-FO の高度な機能を使用する際に役立つ、CSSToXSLFO 専用の CSS 拡張命令も含まれています。

この記事で紹介するような単純な使い方の場合には、そうした拡張命令は必要ありません。CSSToXSLFO ユーティリティーは、この HTML 文書を XSL-FO 文書に変換し、その XSL-FO 文書がその HTML 文書に非常によく似た PDF 文書を生成します。

次に、HTML に変換された文書を html-to-xslfo() 関数を使用して XSL-FO 文書に変換し、さらに PDF 文書を生成します (リスト 3)。PDF を作成するためには eXist の xslfo モジュールの render() 関数を使用します。

リスト 3. XML データを PDF フォーマットに変換する XQuery スクリプト (サンプル・コードの中の example-02.xql ファイル)
xquery version "1.0"; 
declare namespace xslfo="http://exist-db.org/xquery/xslfo"; 
declare namespace k-Pub="http://kuberam.ro/k-Pub"; 
let $xml-data := doc('/db/html-and-pdf-single-stylesheet/xml-data.xml') 
let $xslt-stylesheet := doc('/db/html-and-pdf-single-stylesheet/xml-to-html.xsl') 
let $html := transform:transform($xml-data, $xslt-stylesheet, ()) 
let $fo := k-Pub:html-to-xslfo($html) 
let $pdf := xslfo:render($fo, "application/pdf", ()) 
return response:stream-binary( $pdf, "application/pdf", "output.pdf" )

図 2 は PDF に変換された文書をブラウザーで表示した結果を示しています。この PDF 文書は 3 つの請求書の詳細をまとめてセリフ・フォントで表示しています (図 1 と図 2 のコンテンツをテキストにしたものを表示するにはここをクリックしてください)。

図 2. PDF フォーマットに変換した結果
PDF フォーマットに変換した結果のスクリーン・キャプチャー

リスト 4 には HTML とPDF の両方で XML データを表示するために必要な CSS 命令が含まれています。ここでは HTML と見た目が似ている PDF ファイルとなるように、表の見出しを太字にする CSS 命令を 1 つだけ追加しました。

リスト 4. HTML と PDF の両方で見た目が似ているように XML を表示するための CSS 命令
body { 
    font-family: arial; 
    font-size: 12px; 
    text-align: center; 
} 
table { 
    border-collapse: collapse; 
    width: 100%; 
    border: solid black 1px; 
} 
table th, td { 
    border: solid black 1px; 
} 
@media screen { 
    body { 
        width: 570px; 
    } 
} 
@media print { 
    table th { 
        font-weight: bold; 
    } 
}

まとめ

この記事では、単純な関数を使用して XML データを HTML フォーマットと PDF フォーマットの両方に変換する方法を説明しました。ここで使用しているのは、CSS 構文の強力さと単純さ、そして複雑な XSL-FO 機能を処理するための拡張命令のみです。この記事で紹介した方法は、単純なスタイル設定のレポートや文書を作成する場合に特に有効です。


ダウンロード

内容ファイル名サイズ
Complete code exampleshtml-and-pdf-single-stylesheet.zip4KB

参考文献

学ぶために

  • Web Development with XRX: XRX 環境について学んでください。
  • CSSToXSLFO User Guide: スタイルシートとフォーマット設定の考え方について理解してください。
  • New to XML: XML を学ぶために必要なリソースを入手することができます。
  • developerWorks の XML ゾーン: DTD、スキーマ、XSLT など、XML の領域でのスキルを磨くためのリソースが豊富に用意されています。XML 技術文書一覧に用意された、さまざまな技術記事やヒント、チュートリアル、技術標準、IBM Redbooks を見てください。
  • IBM XML certification: XML および関連技術において IBM 認定技術者になる方法を参照してください。
  • developerWorks の Technical events and webcasts: これらのセッションで最新情報を入手してください。
  • developerWorks on Twitter: 今すぐ Twitter に参加して developerWorks のツイートをフォローしてください。
  • developerWorks podcasts: ソフトウェア開発者のための興味深いインタビューや議論を聞いてください。
  • developerWorks On demand demos: 初心者のための製品インストール方法やセットアップのデモから、上級開発者のための高度な機能に至るまで、多様な話題が解説されています。
  • IBM 製品の評価版: IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2、Lotus、Rational、Tivoli、WebSphere などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

製品や技術を入手するために

議論するために

コメント

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, Web development
ArticleID=789753
ArticleTitle=1 つの XSLT スタイルシートを使用して HTML と PDF で XML データを公開する
publish-date=02032012